这里同时出现了函数声明提前,和变量的预解析,但是不管(var foo = 11;
放哪里,都返回function
这里表述有误
为什么SF中Markdown的~~删除线~~不能用...),是什么原因
function bar() {
return foo;
foo = 10;
function foo() {};
var foo = 11;
}
console.log(typeof bar());//function 为什么不是number
网上查的资料:
http://www.bootcss.com/article/variable-and-function-hoisting-in-javascript/
解析器将当前作用域内声明的所有变量和函数都会放到作用域的开始处
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheetfunction
:Three forms with different scope behavior:
(为什么有三种...)declared
: as a statement at the parent function top-level
behaves like a var binding that gets initialized to that function initialization**"hoists" to the very top of the parent function, above vars**
函数声明提前到当前作用域最顶端,在var
之上,但还是不懂:最顶端,那不会被后来的var给覆盖么statement
:as a statement in a child block
behaves like a var binding that gets initialized to that function
does not hoist to the top of the parent functionexpressed
: inside an expression bound in the expression only
然后现在,问题变成了:为什么var foo
无论放在function foo...
前面还是后面,都返回function
function bar() {
var foo;
function foo() {};
return foo;
}
console.log(typeof bar());
答案如 @yofine 代码所写,
var foo = 11
实际上是两句话var foo; foo = 11
,函数中只有声明(包括变量声明和函数声明)会被提前(hosited),所以foo = 11
还是原来的位置。两次赋值都在return 之后所以自然是Function
了,如果把foo = 10
放到return 前面就是Number
了。新问题参见这里(引自:http://www.cnblogs.com/MockingBirdHome/p/3385152.html):
如果存在函数声明和变量声明(注意:仅仅是声明,还没有被赋值),而且变量名跟函数名是相同的,那么,它们都会被提示到外部作用域的开头,但是,函数的优先级更高,所以变量的值会被函数覆盖掉。
但是,如果这个变量或者函数其中是赋值了的,那么另外一个将无法覆盖它:
另外,~~做删除线的是Markdown的扩展语法,SF对扩展语法支持的不全,你可以直接使用HTML标签做
删除线。