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

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,后面的声明自动忽略了)

JS函数是如何执行的的更多相关文章

  1. UI5-技术篇-JS函数eval动态执行

    <html lang="en"> <head> <meta charset="utf-8" /> <title> ...

  2. EL表达式的js函数传参问题

    <!Doctype html> <html> <head> <title>js的传参问题</title> <script type=& ...

  3. 在JS函数中执行C#中的函数、字段

    1.调用字段 cs文件的代码: ; protected void Page_Load(object sender, EventArgs e) { id = ; } js页面的代码: function ...

  4. (转)在网页中JS函数自动执行常用三种方法

    原文:http://blog.sina.com.cn/s/blog_6f6b4c3c0100nxx8.html 在网页中JS函数自动执行常用三种方法 在网页中JS函数自动执行常用三种方法 在HTML中 ...

  5. javascript笔记——点击按钮(或超链接)如何跳转到另外一个页面并执行目标页面的js函数

    页面跳转同时执行js代码$(function(){});url参数传递 标题的前半部分其实不必赘述,按钮也可以换成超链接.. 假设是需要在A页面上的一个按钮,点击后跳转到B页面,传一些参数后且并B页面 ...

  6. JS中的自执行函数

    本来规划的是2013年,狠狠的将JS学习下,谁知计划赶不上变化,计划泡汤了.13年的我对JS来说可以说是属于跟风,对它的理解和认识也仅仅是皮毛而已,也是因为要完成<ArcGIS API for ...

  7. 在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

    有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...

  8. JS函数自动执行

    关于让网页中的JavaScript函数自动执行,方法就多洛,但是万变不离其宗,下面给大家介绍一下! 前提条件,网页中必须有JS函数代码,或者,使用文件导入的方法也行: 在HTML中的Head区域中,有 ...

  9. 从setTimeout看js函数执行

    老实说,写这篇文章的时候心里是有点压抑的,因为受到打击了,为什么?就 因为喜欢折腾不小心看到了这个"简单"的函数:        for (var i = 0; i < 5; ...

随机推荐

  1. 学员报名WDP培训之前必须阅读

    Oracle WDP核心概念:Oracle WDP的全称为Oracle Workforce Development Program,主要面向学生.个人市场,这是Oracle公司针对职业教育市场在全球推 ...

  2. schema约束和引入

    schema的概述 schema约束同为xml文件的约束模式语言之一, 最大的作用是为了验证xml文件的规范性的. 是为了解决dtd约束不够的问题, 相应的他的配置就变得比较复杂 schema本身就是 ...

  3. 获得APP当前显示的viewController

    UIViewController* topViewController = ((UINavigationController*)self.window.rootViewController).topV ...

  4. Octave安装和使用

    1. Installer  Download octave4.0 gnuplot 5.0.4 2. Installation (1) Octave 安装Octave时提示发现系统装有Win8,继续安装 ...

  5. hosts持续更新

    Google hosts网址: https://laod.cn/hosts/2016-google-hosts.html

  6. 数据库:mongodb与关系型数据库相比的优缺点 (转)

    与关系型数据库相比,MongoDB的优点:①弱一致性(最终一致),更能保证用户的访问速度:举例来说,在传统的关系型数据库中,一个COUNT类型的操作会锁定数据集,这样可以保证得到“当前”情况下的精确值 ...

  7. MATLAB中白噪声的产生

    rand产生的是[0,1]上的均匀分布的随机序列randn产生均值为0,方差为1的高斯随机序列,也就是白噪声序列 rand产生的是均匀分布白噪声序列randn产生的是正态分布的白噪声序列 MATLAB ...

  8. Xen启动过程分析(还是分享过来吧,找了好长时间)

    XEN启动过程     ‍Xen Hypervisor运行在Ring0,在启动过程中,Xen首先被引导:系统由Grub启动,遵循Multiboot引导规范:然后Linux内核做为module也被引导入 ...

  9. CxImage图像库的使用 .

    http://blog.csdn.net/wangjie0377/article/details/7830405 CxImage图像库 CxImage下载地址:http://www.codeproje ...

  10. PAT题库-1064. Complete Binary Search Tree (30)

    1064. Complete Binary Search Tree (30) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHE ...