术语 context 让我有点困惑。如果我在一个函数中声明一个函数,即嵌套函数并在那里执行,如下所示......
function foo(){
function fo(){
alert(this);
}
fo();
}
这个关键字应指向函数对象而不是 window ,因为函数fo()在其父函数内。因为函数也是一个javascript对象,而不是为什么this关键字是遍历函数对象并指向窗口?
此关键字也指向函数操作的当前对象,因此函数对象是嵌套函数操作的对象。
答案 0 :(得分:2)
如果您只是在顶层呼叫foo()
,则它与window.foo()
相同
window
是foo的实际context
,因此,this
指向window
对象。
答案 1 :(得分:1)
添加到dlutxx所说的内容。如果你有一个函数(在全局空间中)并且你只是像foo()
那样调用它,那么上下文就是窗口本身(因为函数是window对象的一个成员)。但是,如果使用new
关键字获取函数的新实例,this
将引用函数对象。
function foo() {
alert(this);
}
foo(); // "this" inside the function will be window
new foo(); // "this" inside the function will be the function object.
如果您想在函数中设置this
的自定义值,可以使用.call()
调用它,如:
foo.call(x); // "this" inside the function will be x
您案例的示例代码:
function foo(){
function fo(){
alert(this);
}
fo(); // "this" is window
new fo(); // "this" is the function object
fo.call('x'); // "this" is 'x'
}
答案 2 :(得分:1)
如果你在一个不是构造函数的函数中随机使用this
,那么你会得到一些不同的结果:
function callThis () { return this; }
callThis(); // returns window object
var Bob = { func : callThis };
Bob.func(); // returns Bob
callThis.call(Bob); // returns Bob
呼叫是一种用于确定呼叫上下文的方法 如果无法通过以下方式确定呼叫的上下文:
一个。什么在“。”前面。 (Bob.func();
)
湾明确传达给.call()
,.apply()
或.bind()
然后将其设置为window
。
这就是上下文的解决方法。
因此,如果您对this
有特定的对象,那么您的解决方案如下:
function objMethod () {
var self = this;
function doStuff () {
self.otherFunc();
self.otherProperty = "bob";
}
doStuff();
}
var myObj = { myMethod : objMethod };
myObj.myMethod();
myObj
调用objMethod
并将上下文设置为myObj
objMethod
将对当前上下文(myObj
)的引用保存为self
。 doStuff
使用引用来修改引用对象的属性。
function outer () {
function inner () { this.property = "Bob"; }
inner.call(this);
}
var obj = {};
outer.call(obj);
此处,outer
使用.call()
传递上下文
然后使用inner
this
outer
传递.call()
var bob = { name : "Bob" };
function sayName () { console.log(this.name); }
var bobFunc = sayName.bind(bob);
bobFunc();
.bind()
在此,我们使用this
创建一个sayName版本,其中bob
始终设置为{{1}}。
您可以随意混合和匹配这些系统(当您处理异步编程时,您可能会这样做。)
答案 3 :(得分:0)
我的理解是虽然function fo()
的范围定义了function foo()
,但这意味着除非您将其返回,否则无法从foo
的外部访问它,但适用于this
的规则调用此内部函数时function f() {
function g() {
console.log(this)
}
console.log(this);
g();
g.apply(this);
}
f() // => Window, Window, Window
f.apply(this) // => Window, Window, Window
f.apply({}) // => Object, Window, Object
的值仍然与调用任何其他函数时的值相同。
{{1}}