JavaScript闭包,关于对象和这个

时间:2014-12-07 06:27:45

标签: javascript closures

function abc(v){
    console.log(v);
}

var abcd= abc;

var module = {
    name: "hello",
    innerFunc: function(){
        console.log("name "+name);

    },
    outterFunc: abc("run from module")
}

innerFunc有没有办法引用name的值?

我的想法是应该有办法,因为它们都在module对象中。我可能完全错了。

请告诉我为什么以及为什么不呢?

PS:

实际上,我通过向其添加以下代码来想出

var module = {
    name: "hello",
    innerFunc: function(){
        var self = this;
        console.log("name "+self.name);
    },
    outterFunc: abc("run from module")
}

因此,后续问题是,为什么innerFunc未运行outterFuncoutterFunc在运行代码后立即调用,为什么innerFunc具有module.innerFunc()明确地称为{{1}}。

谢谢

1 个答案:

答案 0 :(得分:0)

首先,您不必将this别名为self来使用实例属性。您可以像这样写innerFunc

innerFunc: function(){
    console.log("name "+this.name);
},

您可能在其他代码示例中看到了var self = this,这是解决this进入函数范围时更改这一事实的常用方法。这不是我关心的技术......通常使用有意义的变量名称会更清楚。但是,在您的情况下,根本不必将this别名为self

要回答第二个问题,了解函数定义和函数调用之间的区别非常重要。

定义一个函数时,它不会被执行 - 无论它在何处定义。请考虑以下示例:

function f() {
    console.log('f');
}
var o = {
    m: function() {
        console.log('m');
    }
}

在该示例中,有两个函数定义,但没有函数调用。换句话说,如果运行此脚本,函数f将存在,方法o.m将存在,但两者都不会被执行,因此命令行上不会打印任何内容。通常,如果您看到关键字function,则表示您正在处理函数定义,不是调用。以下代码现在依次调用这两个函数:

f();
o.m();

在这种情况下,将发生对console.log的两次调用。

在您的示例中,您通过调用函数outerFunc 定义属性abc(我怀疑这不是您想要的)去做)。我怎么知道你在调用它?因为有括号且没有function关键字:

var module = {
    //...
    outterFunc: abc("run from module")
}

这里发生的事情是abc正在调用 ,其返回值正在分配给outerFunc。由于abc不返回任何内容,outerFunc将获得值undefined。这就是为什么我猜这不是你想要的。如果您希望m.outerFunc成为abc别名,您可以这样做:

var module = {
    //...
    outerFunc: abc
}

请注意,没有括号...因此abc 被调用。现在module.outerFuncabc的别名。不过要小心!这是在JavaScript中对函数进行别名的一种危险方法...在这种情况下,它可能没问题,因为你是一个函数(不是一个方法)的别名,所以this没有达到预期的危险,但是如果你试图将方法别名化,那么你会遇到这种情况。所以一般来说,应该谨慎使用这种技术。

如果您希望outerFunc 致电 abc,您必须这样做:

var module = {
    //...
    outerFunc: function() {
        abc();
    }
}

在这种情况下,abc 被调用...它位于函数定义中,因此只有在调用m.outerFunc时才会调用它。

我知道这一切看起来都很令人困惑,但这些都是非常重要的区分,所以如果这个答案不明确,请告诉我。