无法理解窗口隐式对象的这种行为

时间:2012-02-13 16:51:45

标签: javascript

HTML code:

<html><body><pre><script src="pippo.js"></script></pre></body></html>  

Javascript代码(文件“pippo.js”):

document.writeln("start");
var f1 = function(){
    document.writeln('Hello, world! f1');
}

var f2 = function(){
    document.writeln('Hello, world! f2');
}
(window)

在浏览器中输出(我尝试使用Chrome和FF):

  

开始
  你好,世界! f2

为什么执行上一个defiend函数? 如果我添加a=0 f2未执行 所以在我看来,最后的定义是evalueted 我不知道为什么。

1 个答案:

答案 0 :(得分:2)

普通function(){}()是无效的表达 但是,function x(){}()var x = function(){}();是有效的。

在JavaScript中,使用括号调用函数。

var f2 = function(){ document.writeln('Hello, world! f2'); }(window)
//       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^|      |
//             Function definition                          Invoke function

声明变量f2,并将函数的返回值赋给它。它没有任何返回值,因此f2undefined

但是,在您的函数中,您正在调用document.writeln方法,该方法在文档中打印一行内容。这是你观察到的效果的原因。

(您的代码也可以用这种方式编写):

var some_function = function(){ document.writeln('Hello, world! f2'); };
var f2 = some_function(window);

<小时/> 如果你想在下一行使用(window),而不调用f2行的函数,你必须在该行的末尾添加一个分号:

var f2 = function(){ document.writeln('Hello, world! f2'); };
(window); //                                                ^ Semicolon