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
未运行outterFunc
,outterFunc
在运行代码后立即调用,为什么innerFunc
具有module.innerFunc()
明确地称为{{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.outerFunc
是abc
的别名。不过要小心!这是在JavaScript中对函数进行别名的一种危险方法...在这种情况下,它可能没问题,因为你是一个函数(不是一个方法)的别名,所以this
没有达到预期的危险,但是如果你试图将方法别名化,那么你会遇到这种情况。所以一般来说,应该谨慎使用这种技术。
如果您希望outerFunc
致电 abc
,您必须这样做:
var module = {
//...
outerFunc: function() {
abc();
}
}
在这种情况下,abc
不被调用...它位于函数定义中,因此只有在调用m.outerFunc
时才会调用它。
我知道这一切看起来都很令人困惑,但这些都是非常重要的区分,所以如果这个答案不明确,请告诉我。