首頁  >  問答  >  主體

javascript - 为什么在JS中foo=bar() 不用事先声明变量foo

举个例子,假如简单的代码是这样的:

function bar(){
return 1;
}
foo=bar(); //foo=1;
console.log(typeof foo); //'number'

在这里foo并不是一个函数,而是一个数字。但是,如果写成下面的这种格式:

foo=function bar(){
return 1;
}
console.log(typeof foo); //'function'

这个时候,foo是一个函数了。

不太明白是什么造成了这两者之间的区别。另外我手边有一本高程三,请问在这本书里面我应该看哪一块的内容,来更好地理解。

大家讲道理大家讲道理2723 天前296

全部回覆(7)我來回復

  • 巴扎黑

    巴扎黑2017-04-11 11:25:08

    foo=bar() bar函数已经执行了 foo等于他返回的值 1

    var num = 1;是在当前域中声明变量. 
    如果在方法中声明,则为局部变量;如果是在全局域中声明,则为全局变量。
    
    而 num = 1 事实上是对属性赋值操作。
    首先,它会尝试在当前作用域链(如在方法中声明,则当前作用域链代表全局作用域和方法局部作用)中解析 num;
    如果在任何当前作用域链中找到num,则会执行对num属性赋值;
    如果没有找到num,它才会在全局对象(即当前作用域链的最顶层对象,如window对象)中创造num属性并赋值。
    注意!它并不是声明了一个全局变量,而是创建了一个全局对象的属性。

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-11 11:25:08

    (function(){
       n = 1;
       console.log(n);
    })()
    console.log(n);
    console.log(window.n);

    应为挂在window 下的属性.

    function bar(){
      return 1;
    }
    foo=bar(); //foo=1;
    console.log(typeof foo); //'number'
    

    这里foo为bar执行之后的返回值. 1, typeof 1// number

    foo = function(){...}

    这里foo声明一个function 名为foo...

    所以题主思考一下下面的foo 值为什么?

    foo = (function(){
      return 1;
    })();

    回覆
    0
  • 怪我咯

    怪我咯2017-04-11 11:25:08

    one

    foo=bar(); //foo=1; 这样是把bar()函数的返回值赋给foo.

    two

     foo=function bar(){
        return 1;
     }
     //这样是讲函数bar指针赋给foo

    回覆
    0
  • PHP中文网

    PHP中文网2017-04-11 11:25:08

    你写的两种代码不是相同的

    • 第一个是执行bar(function),然后把结果(number)赋值给foo

    • 第二个是直接把方法(function)赋值给foo

    如果要和第一个一样,应该这么写:

    foo=(function bar(){
    return 1;
    })();
    console.log(typeof foo); //'number'

    回覆
    0
  • 黄舟

    黄舟2017-04-11 11:25:08

    你的第一个例子foo=bar();既然bar已经被执行了,那么foo等于bar()执行后的结果,就是一个number了,
    第二个例子

    foo=function bar(){
        return 1;
    }

    bar是一个函数,foo等于的是一个函数,又不是执行之后的结果,肯定是一个function了

    回覆
    0
  • 高洛峰

    高洛峰2017-04-11 11:25:08

    第一段代码是执行了bar(),得到了结果赋值给了foo,所以这个时候foo的类型是number;
    第二段代码是把整个函数赋值给了foo,这个函数是放置在内存中的堆区域,是一个指针,指针间的赋值,赋值的是地址。所以,foo的类型是function。

    回覆
    0
  • 阿神

    阿神2017-04-11 11:25:08

    在非严格模式下,对一个未声明的,unqualified 标识符赋值,会自动创建全局对象(如 window)下的属性。

    var a
    a = 1
    delete a // false
    a = 1
    delete a // true

    回覆
    0
  • 取消回覆