我正在使用所谓的IIFE代码,我有以下测试代码
window.onload = function()
{
var a = "test 3";
var testfunct = (function test() { return function(a){ alert(a+' returning a function') } }(a))
alert(testfunct(a))
alert(testfunct) // prints function code
alert(testfunct('test 4'))
}
第一次调用alert会产生分配给testfunct的函数。 但是接着有第二次警告“未定义”
alert(testfunct)
将函数代码生成为字符串
下一次调用警报会产生'test 4 return a function' 然后第二个警报再次出现'undefined'
为什么第二次警报
(可能会在通话中调用警报吗?)
编辑:
我改变了
alert(testfunct(a))
// and
alert(testfunct('test 4'))
到
testfunct(a)
// and
testfunct('test 4')
所以现在没有显示第二个警报, 我感谢时间和关注我的问题。 大多数回答似乎表明响应者没有完全阅读 问题和描述
作为进一步的评论,我这样做是为了掌握这种代码风格。但是我 没有看到这种代码的优势。
我阅读了有关各种技术主题的O'Reilly书籍,并获得了关于KISS的规则 然后它变得复杂了
例如,在构造函数
中创建私有属性function example()
{
var x = 'foo'
function y(){return "call to function y"}
this.run = function(){ y() }
}
var it = new example()
alert(it.x) // --> x is undefined (because it is declared in private scope of the function)
it.y() // it.y is undefined or it.y() is not a function
it.run() // 'call to function y' because this.run makes it a public method.
因此关于闭包和高级函数的所有卷积以及所有这些看起来有点相反。 我认为有可能,如上例所示
it =''
并且分配给'it'的整个构造被销毁。因此任何分配给全球空间的标签 同样对此负责。但是如果你没有将代码和/或属性分配给全局的东西,那是什么 关键点。是否可以访问?
答案 0 :(得分:3)
你有:
alert(testfunc(a));
变量a
包含字符串"test 3"
,因此调用" testfunc"导致第一个警报。该函数返回,然后您将返回值传递给alert()
。该函数不返回任何内容,因此您会看到undefined
。
该声明中发生了什么,细分:
"test 3"
alert()
调用,用于生成一个弹出窗口,其中包含一个由参数和一个固定字符串组成的消息,因此您可以看到该弹出窗口。undefined
,因为它缺少return
语句。alert()
,所以你看到" undefined"在第二个弹出窗口中。要进一步澄清:请注意,在任何一次调用" testfunc"中,比如说:
testfunc("Hi");
会有一个alert()
弹出窗口,它不会只是说undefined
。但是,问题中的代码并不是简单地调用函数:它调用函数,然后将其返回值传递给另一个 alert()
调用。好像代码看起来像这样:
var testfuncResult = testfunc(a);
alert(testfuncResult);
那就是神秘的第二个alert()
。