js变量提升问题

(function(){
    var foo;
    console.log(typeof foo); //function
     
    function foo(){}
 
    foo = "foo";
    console.log(typeof foo); //string
})();

不懂第二个为什么打印 string 啊?
foo已经是函数了,函数能直接赋值成字符串?

阅读 1.9k
3 个回答
var foo;
console.log(foo); //function foo()
     
function foo(){}
 
foo = "foo";
console.log(foo); //foo

javascript 是弱类型的语言,变量没有类型声明,都是按照赋值时值的类型来确定类型的。

提升以后变成这样子:

(function(){
    var foo;
    function foo(){}
    
    console.log(typeof foo); //function
      
    foo = "foo";
    console.log(typeof foo); //string
})();

所以,当第二个typeof foo的时候,foo已经是一个string

感觉你应该这样问:

(function(){
    console.log(typeof foo); //function
    function foo(){}
    foo = "foo";
    console.log(typeof foo); //string
})();

相当于:

(function(){
    var foo = function(){};
    console.log(typeof foo); //function
    foo = "foo";
    console.log(typeof foo); //string
})();

JS是弱类型语言,类型是可以变的。给foo赋值字符串"foo"后,foo变量就是字符串类型了。同理,给foo = 1typeof foo就是number了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题