为什么在另一个函数返回的函数中有第二次调用警报

时间:2014-11-23 23:32:25

标签: javascript

我正在使用所谓的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'的整个构造被销毁。因此任何分配给全球空间的标签 同样对此负责。但是如果你没有将代码和/或属性分配给全局的东西,那是什么 关键点。是否可以访问?

1 个答案:

答案 0 :(得分:3)

你有:

alert(testfunc(a));

变量a包含字符串"test 3",因此调用" testfunc"导致第一个警报。该函数返回,然后您将返回值传递给alert()。该函数不返回任何内容,因此您会看到undefined

该声明中发生了什么,细分:

  1. 打电话给" testfunc"函数,作为唯一参数,变量" a"的值,即"test 3"
  2. " testfunc" function包含一个alert()调用,用于生成一个弹出窗口,其中包含一个由参数和一个固定字符串组成的消息,因此您可以看到该弹出窗口。
  3. " testfunc"函数返回undefined,因为它缺少return语句。
  4. 调用" testfunc"的结果被传递给alert(),所以你看到" undefined"在第二个弹出窗口中。
  5. 进一步澄清:请注意,在任何一次调用" testfunc"中,比如说:

    testfunc("Hi");
    

    会有一个alert()弹出窗口,它不会只是说undefined。但是,问题中的代码并不是简单地调用函数:它调用函数,然后将其返回值传递给另一个 alert()调用。好像代码看起来像这样:

    var testfuncResult = testfunc(a);
    alert(testfuncResult);
    

    那就是神秘的第二个alert()