含义: this指向函数运行时的执行环境。而这个执行环境跟函数的声明没关系。
列子:
var obj = { foo: function () { console.log(this.bar) }, bar: 1};var foo = obj.foo;var bar = 2;obj.foo() //1foo(); // 2
obj.foo() foo函数运行时所处的环境是 obj环境 而 foo()函数运行时所处的环境是全局环境 也就是window环境。所以 方式1: this 执行了 函数运行时的环境obj 而方式2执行了函数运行时的环境window环境。那么
方式1取到的this.bar ===> obj.bar 方式2取到的this.bar ===> window.bar。
改变this指向:(显示绑定)
var obj = { foo: function () { console.log(this.bar) }, bar: 1};var foo = obj.foo;var bar = 2;obj.foo() //1foo.call(obj); // 1
首先概括一下 call方法: 函数也是对象,是对象也会有属性和方法。call方法就是函数的一个 方法,这个方法是继承于Function.prototype 所有开发者声明的函数 都是属于Function的实例 fn.constructor === Function。
call:把第一个参数,作为该函数运行时的上下文或执行环境。也就是说 foo.call(obj) 运行时的执行环境即this 已经变为obj了 所以输出了 1。
类似方法: call apply bind
不同点: call(context,参数1,参数2)
apply(context,[参数1,参数2])
bind(context,参数1,参数2)(); //函数不会自执行 需要手动调用
完毕!仅仅作为本人的学习总结!