zoukankan      html  css  js  c++  java
  • js中函数带不带var的本质区别是什么

    本质区别是:带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
    >
  • 相关阅读:
    Single Number II
    Pascal's Triangle
    Remove Duplicates from Sorted Array
    Populating Next Right Pointers in Each Node
    Minimum Depth of Binary Tree
    Unique Paths
    Sort Colors
    Swap Nodes in Pairs
    Merge Two Sorted Lists
    Climbing Stairs
  • 原文地址:https://www.cnblogs.com/JMLiu/p/7198960.html
Copyright © 2011-2022 走看看