JavaScript 的一大特点是,函数存在「定义时上下文」和「运行时上下文」以及「上下文是可以改变的」这样的概念。

https://www.cnblogs.com/coco1s/p/4833199.html

this即1,作用域 2,context 3,环境

//按照原型链查找机制往上级作用域找
var name = 'maotai';
var obj = {
fn: function () {
console.log(name);
}
};
obj.fn(); //输出maotai
//this限制了执行环境
var name = 'maotai';
var obj = {
fn: function () {
console.log(this.name);
}
};
obj.fn(); //undefined

但是我在学es6的时候

//对象不是作用域
// let a = 10;
// let obj = {
// a: 20,
// f: function () {
// console.log(a);
// }
// };
// obj.f();

call的使用规则

    function fn2() {
console.log("fn2 this: " + this);
} fn2.call(); //fn2 this: [object Window]
    function Fn(x, y) {
console.log(arguments); //实参集,类数组
console.log(this);
} var obj = {'name': 'maotai'};
Fn.call(obj, 1, 2);
Fn.call();          //window
Fn.call(null); //window
Fn.call(undefined); //window
Fn.call(obj, 1, 2); //obj

把Fn放到obj环境执行.

  • 例子1: Fn.call
    function Fn() {
console.log(this.name);
}
var obj = {name:'maotai'};
Fn.call(obj);//Fn中的this被改成了obj
  • 例子2: 输出f2
    function f1() {
console.log('f1');
} function f2() {
console.log('f2');
} f2.call(f1); //输出f2
function fn1() {
console.log("fn1 this: " + this);
} function fn2() {
console.log("fn2 this: " + this);
} fn1.call.call.call(fn2);
1:这个方法是在哪开始执行的 call(fn2)

2:执行后的结果是什么 call(fn2) 前面的this 改成了fn2 前面方法照常执行

3:call(fn2) 前面是什么,改变this 后会怎样 call(fn2)
前面是fn1.call 改变this后 由于fn1是这次的行为主体(this),
是他执行了call 方法,所以fn1 被call(fn2)变成了 fn2,所以接下来执行的就是 fn2.call() 4:输出 fn2 this: [object Window]

this的5种情况总结:

https://www.cnblogs.com/iiiiiher/articles/9813889.html

1. 点前是谁就是谁
2. 自执行函数
3. 获取元素节点
4. 回调函数
5. call,apply,bind

最新文章

  1. JAVA安装过程中出现的“javac不是内部或外部指令”的解决方法
  2. ORACLE存储过程调用Web Service
  3. 怎么在MVC中使用自定义Membership
  4. python嵌套函数、闭包与decorator
  5. IEnumerable和IQueryable和Linq的查询
  6. 支付宝APP支付后台参数生成Java版(一)
  7. 《与mysql零距离接触》视屏学习笔记
  8. 32、shiro 框架入门三
  9. android 进程/线程管理(二)----关于线程的迷思
  10. [Google Code Jam (Round 1A 2008) ] A. Minimum Scalar Product
  11. js数组(一)
  12. 其他信息: Error creating context 'spring.root': 未能加载文件或程序集“EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089”或它的某一个依赖项
  13. phpStudy环境安装SSL证书教程
  14. leetcode124
  15. [转] JavaScript:彻底理解同步、异步和事件循环(Event Loop)
  16. How to return AJAX errors from Laravel Controller?
  17. CSS中text-shadow的几个好看的文字demo及其代码
  18. 写Java代码的一些小技巧
  19. 自定义oncontextmenu
  20. async/await actor promise 异步编程

热门文章

  1. 关于ie6出现的问题的原因归结
  2. solus 系统 - 更新软件源
  3. golang - channels
  4. class in Bad version
  5. 初学的linux命令行
  6. 品尝阿里云容器服务:用nginx镜像创建容器,体验基于域名的路由机制
  7. angularjs 异步请求无法更新数据
  8. wpf(第一章 基础知识)
  9. ssh agent-forward
  10. Mac终端的Cocoapods的安装及使用