var x = 1; if (function f(){}) { x += typeof f; } x;
返回值为"1undefined"
它们应该是在同一作用域,为什么type语句调用不到f函数?
人生最曼妙的风景,竟是内心的淡定与从容!
这和if没有关系
jsvar x = function f(){}; console.log(typeof x, typeof f); //function undefined
js
var x = function f(){}; console.log(typeof x, typeof f); //function undefined
这是函数表达式和函数声明语句的区别,前者带名字只会影响x.name而不会声明对应的变量,后者不仅会声明,还有提升的效果,比如
x.name
jsconsole.log(typeof g); function g(){}; //function
console.log(typeof g); function g(){}; //function
函数表达式的函数名作用域是闭包内。除了IE8貌似有bug。
if ( expression ) statement
所以這裏的 function f(){} 是一個函數表達式,over。
很簡單了
js var x = 1; if (function f(){}) { x += typeof f; } x;
首先我們分析下, if裡面是true還是false. !!function f(){} -> true 所以我們知道 x += typeof f; 要執行.
true
false
!!function f(){} -> true
x += typeof f;
又因為
ECMA 5 (13.0) defines the syntax as
javascriptfunction Identifieropt ( FormalParameterListopt ) { FunctionBody }
javascript
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
所以f是沒有定義的, 於是typeof f 就是'undefined' 是一個string.
f
typeof f
'undefined'
1+'undefined' = '1undefined'. 所以答案就出來了.
1+'undefined' = '1undefined'
Ref:Function Declarations vs. Function Expressions
这和if没有关系
这是函数表达式和函数声明语句的区别,前者带名字只会影响
x.name
而不会声明对应的变量,后者不仅会声明,还有提升的效果,比如函数表达式的函数名作用域是闭包内。除了IE8貌似有bug。
所以這裏的 function f(){} 是一個函數表達式,over。
很簡單了
首先我們分析下, if裡面是
true
還是false
.!!function f(){} -> true
所以我們知道
x += typeof f;
要執行.又因為
ECMA 5 (13.0) defines the syntax as
所以
f
是沒有定義的, 於是typeof f
就是'undefined'
是一個string.1+'undefined' = '1undefined'
. 所以答案就出來了.Ref:
Function Declarations vs. Function Expressions