this

含义: this指向函数运行时的执行环境。而这个执行环境跟函数的声明没关系

 

列子:

var obj = {
  foo: function () { console.log(this.bar) },
  bar: 1
};

var foo = obj.foo;
var bar = 2;

obj.foo()  //1
foo(); // 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()  //1
foo.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)();  //函数不会自执行 需要手动调用

 

posted on 2018-10-11 15:43  斜杠人生  阅读(235)  评论(0编辑  收藏  举报

导航