javascript - 为什么在JS中foo=bar() 不用事先声明变量foo
大家讲道理
大家讲道理 2017-04-11 11:23:08
0
7
292

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

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是一个函数了。

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

大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回覆(7)
巴扎黑

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

var num = 1;是在当前域中声明变量. 
如果在方法中声明,则为局部变量;如果是在全局域中声明,则为全局变量。

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

(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;
})();
刘奇

one

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

two

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

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

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

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

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

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

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

foo=function bar(){
    return 1;
}

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

小葫芦

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

阿神

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

var a
a = 1
delete a // false
a = 1
delete a // true
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!