用Javascript理解内部函数

时间:2015-07-28 06:51:58

标签: javascript

我最近开始学习Javascript,同时使用此代码中的代码进行一些实验:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + this.ab)
        }())
    }
};
k.func();

这段代码给我的结果是“inner1 hi”和“inner2 undefined”。

我没有理解为什么undefined在第二console.log

5 个答案:

答案 0 :(得分:7)

当你调用它时,函数的this被绑定,具体取决于你如何调用它。将其称为值而不是属性 - (expression)()而非object.method() - 将导致this设置为全局对象,或undefined处于严格模式。

函数对象有两种方法可以使用明确指定的thiscallapply来调用函数。你可以在这里使用前者。

(function() {
    console.log("inner2 " + this.ab);
}.call(this));

这会将调用函数的this转发给内部函数。

或者,您可以将this分配给变量。

var that = this;

(function() {
    console.log("inner2 " + that.ab);
}());

答案 1 :(得分:2)

string

执行匿名函数会更改实例,以保持上下文执行:

var k = {
    ab: "hi",
    func: function() {
        console.log(this,"inner1" + this.ab);
        (function() {
            console.log(this,"inner2 " + this.ab)
        }())
    }
};
k.func();

答案 2 :(得分:2)

@minitech和@Issac很好地解释了问题和解决方案。在任何级别获取属性的另一种方法是按对象。在你的代码中是:

var k = {
    ab: "hi",
    func: function() {
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + k.ab)
        }())
    }
};

k.func();

答案 3 :(得分:1)

您没有在第二个功能中使用this的任何参考。相反,您可以使用:

(function() {
    console.log("inner2 " + this.ab)
}.call(this))

答案 4 :(得分:1)

在你的例子中,这个'是指基于范围的两种不同的东西。您可以使用此示例代码。也许它可以帮助你理解基础知识。

var k = {
    ab: "hi",
    func: function() {
        var me = this; // save 'meaning of this' in variable me.
        console.log("inner1" + this.ab);
        (function() {
            console.log("inner2 " + me.ab)
        }())
    }
};
k.func();