丢失`this`关键字的显式绑定

时间:2015-04-13 19:08:48

标签: javascript this

this关键字如何失去其显式绑定并使用默认绑定铺设的示例/场景是什么?这是一个示例代码段,它使用this方法将call关键字明确绑定到对象。对此代码的哪些理论补充可以改变this的值?在严格约束this关键字时,我们保护代码的具体问题是什么?

function foo(){
  console.log(this.bar); // outputs: 9
}

var obj = {
  bar: 9
};

foo.call(obj);

3 个答案:

答案 0 :(得分:3)

一般来说,this没有“明确”的约束。每当根据调用的性质调用函数时,都会确定this的值。它与函数“诞生”的情况无关。

在通过对象属性查找发现其引用之后调用函数时,如:

obj.someFunction();

然后涉及的对象引用(obj,上面)将是函数特定调用中this的值。但是,函数引用可以很容易地复制到另一个对象:

var otherObj = { someFunction: obj.someFunction };
otherObj.someFunction();

现在this(在该特定调用中)的值将是对otherObj的引用,而不是obj

如果对函数的引用被复制到普通变量:

var func = obj.someFunction;

func();

this的值,调用将引用window,如果代码恰好位于“严格”上下文中,则为undefined

通过所有这些,请注意,函数最初可能已被声明为对象文字中的属性值这一事实 nothing 与最终为{{1}的值的内容有关在一次调用中。

创建显式“绑定”的方法是利用每个函数实例可用的内置this.call()方法:

.apply()

该设置明确强制在函数function whatever() { /* ... */ } var objWhatever = function() { whatever.call(obj); }; 的调用中将obj的引用用作this的值。您还可以使用内置(在现代环境中)whatever()函数来创建这样的“绑定”函数:

.bind()

我个人会毫不犹豫地将其称为“绑定”功能,因为在封面下它只是通过var objWhatever = whatever.bind(obj); 进行的明确调用,但术语不是我担心太多。 :)

答案 1 :(得分:0)

正如Pointy提到this的值,或者上下文取决于函数的调用方式,本文Understanding Scope and Context in Javascript很好地解释了它的工作原理。

答案 2 :(得分:0)

添加此代码会覆盖" explicit"绑定,this关键字现在返回8,由"隐式"由otherObj对象创建的绑定。在该对象的空间内调用该函数。

var otherObj = {
  foo: foo,
  bar: 8
};
otherObj.foo();

进一步添加此代码,并且由于在全局空间中调用该函数而没有任何修饰,因此"隐式"绑定被"默认"重写。绑定,返回全局bar变量,结果为7

var secondObj = otherObj.foo;
var bar = 7;
secondObj();

在使用call方法调用函数之前添加此代码会导致将this关键字锁定到secondObj对象上,并导致{{1}的输出结果}。

6