zoukankan      html  css  js  c++  java
  • JS函数是如何执行的

    当局部变量和函数参数同名时,该怎么理解呢?

    function test(a){
            var a=a||5;
            alert(a)
    }
    

    test() //没传参的话,就是5;传参的话就alert参数

    ==================================================

    在 ES5.1 里面函数是这样执行的(不讨论use strict和一些特殊情况,JS好复杂的),按如下顺序执行:

    1. 确定“this”的值 (确切的来说,this在JS里面不是一个变量名而是一个关键字)

    2. 创建一个新的作用域

    3. 处理形参/实参(没有定义过才声明,无论如何都重新赋值,没有对应实参则赋值为"undefined"): 
      对于每一个传入的实参,按照从左往右的顺序依次执行:如果对应的形参在本作用域中还没有定义,则在本作用域中声明形参,并赋值。如果已经定义过了,则重新给其赋值。(没有对应实参则赋值为"undefined")(没有定义:就是“没有声明”的意思)

    4. 处理函数定义(没有定义过才声明,无论如何都重新赋值): 
      对该函数中所有的定义的函数,按照代码写的顺序依次执行:如果这个变量名在本作用域中还没有定义,则在本作用域中声明这个函数名,并且赋值为对应的函数,如果定义了这个变量,在可写的情况下重新给这个变量赋值为这个函数,否则抛出异常。

    5. 处理 "arguments"(没有定义过才声明和赋值): 
      如果在本作用域中没有定义 arguments,则在本作用域中声明arguments并给其赋值。

    6. 处理变量声明(没有定义过才声明,不赋值):
      对于所有变量声明,按照代码写的顺序依次执行:如果在本作用域中没有定义这个变量,则在本作用域中声明这个变量,赋值为undefined

    7. 然后执行函数代码。(当然是去变量定义里面的 var 执行)

    参考:http://www.ecma-international.org/ecma-262/5.1/#sec-10.5

    所以当在函数执行的时候,会自动除去所有的声明,访问一个变量(如果你的代码里没有重新给其赋值的话)查找的顺序其实是:最后一个定义的函数名?,最后一个形参?(e.g. 形参可以重名,以最右边为准)?,arguments?,最前面声明的那个变量?

    所以说,如果test传入参数,就会赋给a,如果没有传入参数a就是undefined,然后除去声明执行代码就是a=a||5;(此时访问的a是形参里声明的那个a,后面的声明自动忽略了)

  • 相关阅读:
    如果一切需要重学,2014年应该学哪些技术?
    LINUX 更新
    LINUX学习
    判断设备是笔记本,还是台式机
    DUILIB 实现微信气泡聊天效果
    OC学习1
    DUILIB 背景贴图
    DUILIB CDialogBuilder 使用问题
    my english dream
    oracle 函数
  • 原文地址:https://www.cnblogs.com/ziyuan-shanliangdehaohaizi/p/6111222.html
Copyright © 2011-2022 走看看