this
关键字如何失去其显式绑定并使用默认绑定铺设的示例/场景是什么?这是一个示例代码段,它使用this
方法将call
关键字明确绑定到对象。对此代码的哪些理论补充可以改变this
的值?在严格约束this
关键字时,我们保护代码的具体问题是什么?
function foo(){
console.log(this.bar); // outputs: 9
}
var obj = {
bar: 9
};
foo.call(obj);
答案 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