2

可能重复:
javascript 中的此运算符

术语上下文让我有点困惑。如果我在函数中声明一个函数,即嵌套函数并在那里执行本身,如下所示......

function  foo(){
    function fo(){
    alert(this);
       }
    fo();
   }

this关键字应该指向函数对象而不是窗口,因为函数 fo() 在其父函数中。既然函数也是一个 javascript 对象,那么为什么 this 关键字遍历函数对象并指向窗口?同样this关键字指向函数操作的当前对象,所以函数对象就是嵌套函数操作的对象。

4

4 回答 4

2

如果你只是调用foo()顶层,它与window.foo().
并且是foowindow的实际值,所以,指向对象。contextthiswindow

于 2013-01-06T04:42:39.140 回答
1

如果您this在不是构造函数的函数内部随机使用,那么您将得到几个不同的结果之一:

function callThis () { return this; }


callThis(); // returns window object

var Bob = { func : callThis };

Bob.func(); // returns Bob

callThis.call(Bob);  // returns Bob

Call 是一种用于确定调用上下文的方法。
如果无法通过以下方式确定调用的上下文:

一个。“。”前面是什么。( 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的引用保存为. 使用引用来修改被引用对象的属性。myObjselfdoStuff

function outer () {
    function inner () { this.property = "Bob"; }
    inner.call(this);
}


var obj = {};
outer.call(obj);

在这里,outer传递了一个上下文,使用.call().
然后inner通过thisof outer,再次使用.call()

var bob = { name : "Bob" };

function sayName () { console.log(this.name); }

var bobFunc = sayName.bind(bob);
bobFunc();

在这里,我们使用.bind()创建一个版本的 sayName ,其中this始终设置为bob
您可以随意混合和匹配这些系统(在处理异步编程时,您可能会这样做)。

于 2013-01-06T05:07:30.527 回答
1

添加到 dlutxx 所说的内容。如果您有一个函数(在全局空间中)并且您只需将其foo()称为上下文就是窗口本身(因为该函数是窗口对象的成员)。但是,如果使用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'
}
于 2013-01-06T04:49:42.947 回答
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
于 2013-01-06T05:04:53.200 回答