函数对象,上下文和这个

时间:2013-01-06 04:37:16

标签: javascript this

  

可能重复:
  this operator in javascript

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

function  foo(){
    function fo(){
    alert(this);
       }
    fo();
   }
这个关键字应指向函数对象而不是 window ,因为函数fo()在其父函数内。因为函数也是一个javascript对象,而不是为什么this关键字是遍历函数对象并指向窗口? 此关键字也指向函数操作的当前对象,因此函数对象是嵌套函数操作的对象。

4 个答案:

答案 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)的引用保存为selfdoStuff使用引用来修改引用对象的属性。

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}}