js中函数带不带var的本质区别是什么
2017-07-18 10:07
423 查看
本质区别是:带var的是定义,属于statement;不带var的是赋值,属于expression。不带var时,解释器认为变量已经定义过了,会在函数中找相应的定义,如果找不到,就会认为变量是在外一层定义的(即字数体外),如果在最外一层也没有定义,这个时候就没有办法,只能在外面强行自己定义一个变量了,这个定义是隐藏的。需要注意的是,我们学说的函数的定义,即形如 function add(a,b){return a + b;}这样的语句,其实只是声明引用,属于statement,这个时候函数是没有执行的,所以一定要中调用函数后,相应的没有用var修饰的变量才会在最外层隐式定义。下面的代码说明了这一点:
1 > function add(){ 2 ... a=3} 3 undefined 4 > a 5 ReferenceError: a is not defined 6 at repl:1:1 7 at sigintHandlersWrap (vm.js:22:35) 8 at sigintHandlersWrap (vm.js:73:12) 9 at ContextifyScript.Script.runInThisContext (vm.js:21:12) 10 at REPLServer.defaultEval (repl.js:340:29) 11 at bound (domain.js:280:14) 12 at REPLServer.runBound [as eval] (domain.js:293:12) 13 at REPLServer.<anonymous> (repl.js:538:10) 14 at emitOne (events.js:101:20) 15 at REPLServer.emit (events.js:188:7) 16 > add() 17 undefined 18 > a 19 3 20 >
因为带var是定义,属于statement。不带var是赋值,属于expression,所以在IIFE中在应用时,也是有区别的。前者不能实现IIFE,后者可以:
1 > (var a=function(){return 2})()-1 2 ... 3 ... 4 > (a=function(){return 2})()-1 5 1 6 >
下面的说句更能说明带var是statement,不带是expressioin:
1 > var a=2 2 undefined 3 > b=3 4 3 5 >
带了var的返回了undefined,而不带的却返回了一个会,说明b=3这个语句是一个expression,所谓expression,就是会产生一个值语句,这个语句可以作为参数传给其它语句,成为其它语句的变量。
> var a=2 undefined > b=3 3 > function add(a,b){return a+b} undefined >
相关文章推荐
- js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
- JavaScript 中,定义函数时用 var foo = function () {} 和 function foo() 有什么区别?
- js中var a=new Object()和var a={}有什么区别吗?
- js中 声明变量时: var $i 和 var i 有什么区别吗 各自是什么意思
- JS中构造函数和普通函数有什么区别
- js中var a=new Object()和var a={}有什么区别吗?
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
- js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
- js里声明函数有几种方式? var abc = function(x){} 和 function abc(x){} 这两种声明方法有什么不同?
- js中 var functionName = function() {} 和 function functionName() {} 两种函数声明的区别
- JS中var声明与function声明两种函数声明方式的区别
- js中var a=new Object()和var a={}有什么区别
- js匿名函数与普通定义的函数有什么区别
- 如何打开JSP文件/JS和JSP的区别/Servlet的本质是什么,是如何工作的?
- Js事件绑定时,函数名加括号和不加括号有什么区别
- js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?
- [js点滴]使用var定义变量和不使用var的本质区别
- js立即执行函数: (function ( ){})( ) 与 (function ( ){}( )) 有什么区别?