一个先有鸡还是先有蛋的问题,先看一段代码: a = 2; var a; console.log(a); 通常我们都说JavaScript代码是由上到下一行一行执行,但实际这段代码输出的结果是2.但这段代码并不能为我们要讨论的问题提供完整的参考意义,所以再看一下代码: console.log(a) var a = 2; 这段代码的测试结果输出了undefined. 这两段代码打破了我们常说的JavaScript代码从上往下执行的说法,那到底是变量声明在前还是赋值在前呢? 函数预编译: 还记得我在上…
这篇博客主要对词法作用域与欺骗词法作用域.函数作用域与块级作用域.函数内部的变量提成原理进行详细的分析,在这篇博客之前,关于作用域.编译原理.浏览器引擎的原理及关系在javaScript的作用域和闭包(一)有详细的阐述,而今天这篇博客是在其基础上对作用域的工作原理进行深入的分析,所有如果有对编译和引擎原理的是很清楚的客官可以查阅一下前面的博客. 一.词法作用域 在大部分标准语言编译器的第一部分工作就是词法化(单词化),词法化的过程会对源代码中的字符串进行检查,如果是有状态的解析过程,还会赋予单词…
  原文:你不知道的js系列 在第(二)节中提到的,标识符在作用域中声明,这些作用域就像是一个容器,一个嵌套一个,这个嵌套关系是在代码编写时定义的. 那么到底是什么产生了一个新的作用域,只有函数能做到吗?JavaScript 的其它代码结构能否创建一个作用域呢? 函数作用域 观察下面的代码: function foo(a) { var b = 2; // some code function bar() { // ... } // more code var c = 3; } 在这段代码中,fo…
一些很重要的说明:前面三篇博客详细的介绍了,引擎与编译器和作用域的关系,重点需要理解的是编译器中的分词与词法分析,JavaScript的特有的“赋值操作的左右侧”引用操作:编译阶段的词法作用域的工作原理和eval.with的欺骗词法作用域:然后还有介绍了函数作用域与块级作用及相关的ES6新特性,接着对函数内部的提升机制和Variable Object的数据读写机制做了详细分析. 这篇博客将对闭包和模块化做详细的分析,但ES6的模块化机制不会在这里详细解析,这篇博客主要对闭包和立即执行函数实现模块…
原文地址 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' console.log(name); //波妞 function fun(){ console.log(name); //波妞 console.log(eat) //ReferenceError: eat is not defined (function(){ console.log(like) //…
一.命名空间 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的方法. 三种命名空间之间的加载与取值顺序: 加载顺序:内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程序运行中:调用时才加载) 取值: 在局部调用:局部命名空间->全局命名空间->内置命名空间 #在局部使用变量取值情况 x = 1…
本文已发布在西瓜君的个人博客,原文传送门 作用域 JS中有两种作用域:全局作用域|局部作用域 栗子1 console.log(name); //undefined var name = '波妞'; var like = '宗介' console.log(name); //波妞 function fun(){ console.log(name); //波妞 console.log(eat) //ReferenceError: eat is not defined (function(){ cons…
一.参数陷阱 在使用默认参数时,可能碰见下列情况 def show_args_trap(i, li = []): li.append(100) li[i] = 101 print(li) show_args_trap(0) show_args_trap(1) show_args_trap(2) # 显示结果为: # [101] # [101, 101] # [101, 101, 101] 分析: 大家知道:含有默认参数的,不输入该参数就使用默认的值:在这里,第一次调用函数的时候,只传入一个参数0…
作用域与闭包 作用域 什么是作用域 作用域就是一套规则,它负责解决(1)将变量存在哪儿?(2)如何找到变量?的问题 作用域工作的前提 谁赋予了作用域的权利?--js引擎 传统编译语言编译的过程 分词/词法分析:字符串 => 词法单元 var a=2; => var a = 2 ;(共5个单元) 解析/语法分析:词法单元流 => 抽象语法树(Abstract syntax tree,AST) 代码的生成: AST => 可执行代码(机器指令) js引擎编译的特点: 代码在执行前进行编…
博主最开始接触程序是C语言,C++,后来是java,现在是php,无论哪一种语言与javascript在机制上都还是有比较大的区别. 下面总结一下用面向对象的思想写javascript需要区分的要点: 在JS中任何位置,没有使用var关键字声明的变量都是全局变量. 动态作用域在执行时确定,其生存周期到代码片段执行为止.动态变量存在于动态作用域中,任何给定的绑定的值,在确定调用其函数之前,都是不可知的. 在JavaScript里并没有块级作用域,也就是说在for.if.while等语句内部的声明的…