javascript同名变量
我写个流程:
在流程之前,必须写一下标识符是啥. 一句话,就是variable object的属性.而这个对象会被不同执行环境来决定. 比如全局环境下的variable object 就是 global, function code 类型的 执行环境,则是 acitvation object ,而 eval code 内的则是 eval code 所在的 calling context 的 variable object . 当然对于eval code稍微有点说法. 参考:ECMA262 Edition5中 所谓eval code 的 direct call 部分.这里就不细说了. 总之所有标识符都是内部对象 variable object的属性.
变量初始化过程是这样的:
词法扫描以后. 把所有标识符找出来,
3种标识符:函数名、形参名、变量名, 是分三个阶段初始化的:
第一步:
初始化函数名,这个过程比较特殊. 因为需要同时创建函数对象, 然后把函数名,作为属性名添加给 variable object ,如果已经存在一个同名的则放弃添加属性名的过程,而直接把创建的函数对象的引用,作为这个属性的值. 如果之前不存在同名属性.则把当前函数名作为属性名,添加给这个variable object .并且对该属性设置 特性集:设置属性无法被delete运算符删除.然后为属性赋值函数对象引用.
第二步:
形参初始化, 同样的,遇到同名的variable object的属性名,放弃添加属性操作. 如果属性名可用,则添加属性,同时,把undefined赋值给这个属性.并设置特性集,使该属性无法被删除.
第三步:
变量初始化,与形参初始化一样.
这里有个例外的初始化过程,发生在 eval code 中.
eval code中 的变量初始化,不会为calling context 的 variable object 添加属性时,设置 [[DontDelete]]特性.所以可以被delete删除.
这就是为什么, 表面上看起来,函数名优先级高于形参,而形参又高于变量名的原因.
而第二个例子的本质问题在于作用域链, fn作为函数名并不存在于内层作用域中. 所以这个测试用例是不恰当的,应该测试同一作用域.或使用同一个variable object的东东.
而其他几个测试用例,似乎都存在一个问题. 即,没有区分开两个过程, 变量初始化过程,早于执行期.
那么 a = 1; 语句执行的时候,初始化早就结束了. 自然无法体现优先级. 肯定是最后被执行的赋值语句.会最终影响结果. 除非这个东西,具备ReadOnly特性.
javascript同名变量的更多相关文章
- [转]深入理解JavaScript的变量作用域
1.JavaScript的作用域链 2.函数体内部,局部变量的优先级比同名的全局变量高. 3.JavaScript没有块级作用域. 4.函数中声明的变量在整个函数中都有定义. 5.未使用var关键字定 ...
- JavaScript笔记:变量及其作用域
一.变量的定义及声明 在javascript中变量仅仅是用来保存值的一个占位符而已,定义变量时要使用关键字var后跟一个变量名,如下所示: var message; //定义一个变量message,像 ...
- 深入理解JavaScript的变量作用域(转载Rain Man之作)
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- javascript的变量声明、数据类型
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 【粗糙版】javascript的变量、数据类型、运算符、流程结构
本文内容: javascript的变量 javascript的数据类型 javascript的运算符 javascript的流程结构 首发日期:2018-05-09 javascript的变量 创建变 ...
- JavaScript:变量提升和函数提升
第一篇文章中提到了变量的提升,所以今天就来介绍一下变量提升和函数提升.这个知识点可谓是老生常谈了,不过其中有些细节方面博主很想借此机会,好好总结一下. 今天主要介绍以下几点: 1. 变量提升 2. 函 ...
- 深入理解JavaScript的变量作用域
在学习JavaScript的变量作用域之前,我们应当明确几点: JavaScript的变量作用域是基于其特有的作用域链的. JavaScript没有块级作用域. 函数中声明的变量在整个函数中都有定义. ...
- JavaScript的变量预解析特性
JavaScript是解释型语言是毋庸置疑的,但它是不是仅在运行时自上往下一句一句地解析的呢?事实上或某种现象证明并不是这样的,通过<JavaScript权威指南>及网上相关资料了解到,J ...
- JavaScript函数变量作用域
变量作用域 在JavaScript中,用var申明的变量实际上是有作用域的. 如果一个变量在函数体内部申明,则该变量的作用域为整个函数体,在函数体外不可引用该变量. 如果两个不同的函数各自申明了同一变 ...
随机推荐
- 一道常考fork题挖掘
#include <stdio.h> #include <sys/types.h> #include <unistd.h> int main(void) { int ...
- codeforces 496B. Secret Combination 解题报告
题目链接:http://codeforces.com/problemset/problem/496/B 题目意思:给出 n 位数你,有两种操作:1.将每一位数字加一(当某一位 > 9 时只保存个 ...
- (转)JAVA AJAX教程第四章—AJAX和MVC的简单结合
这里我们再理解了AJAX后,开始来用实例感受AJAX的力量. 今天我最后要实现的效果,当鼠标放到图片上时会根据,会把数据库库里的数据读出,通过显示框显示出来.这个在很多网上商店都有用到这里效果,我们这 ...
- oracle简历自增序列(转)
步骤:1.创建序列 2.创建触发器. 语法解析:create sequence TB_CODE_SEQUENCEminvalue 1maxvalue 99999999999999999999999 ...
- javaURL中文乱码的问题
中文乱码在java中URLEncoder.encode方法要调用两次解决 一.场景: 1.我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码, ...
- 【leetcode】Reverse Words in a String(hard)☆
Given an input string, reverse the string word by word. For example,Given s = "the sky is blue& ...
- java常用工具类(java技术交流群57388149)
package com.itjh.javaUtil; import java.util.ArrayList; import java.util.List; /** * * String工具类. ...
- webstorm添加vue插件支持
现在已经有vue.js的插件啦,setting --> plugins 就可以咯 ------------------------------------------------ Mac端Web ...
- 二、获取微信用户openId
/// <summary> /// 登录首页 /// </summary> /// <returns></returns> public ActionR ...
- Genymotion
@Genymotion相关文件下载地址 http://pan.baidu.com/s/1nu9nReh @虚拟机网络代理设置 Normal 0 7.8 磅 0 2 false false false ...