Skip to content

Instantly share code, notes, and snippets.

@hjzheng
Last active March 16, 2016 10:46
Show Gist options
  • Save hjzheng/0c365ddca36568191820 to your computer and use it in GitHub Desktop.
Save hjzheng/0c365ddca36568191820 to your computer and use it in GitHub Desktop.

理解作用域链

JavaScript权威指南 P59 中关于作用域链解释的不是很清楚。

JavaScript代码在执行的过程中,需要依赖其执行上下文(Execution Context), 当JavaScript代码被浏览器载入后,默认最先进入一个全局执行上下文,当在全局上下文中调用执行一个函数时,程序流就进入该被调用函数内,此时引擎就会为该函数创建一个新的执行上下文,并且将其压入到执行上下文堆栈的顶部。浏览器总是执行当前在堆栈顶部的上下文,一旦执行完毕,该上下文就会从堆栈顶部被弹出,然后,进入其下的上下文执行代码。这样,堆栈中的上下文就会被依次执行并且弹出堆栈,直到回到全局的上下文。

关于执行上下文(Execution Context) 可以将执行上下文,理解成为一个Object。它主要包含三个属性 变量对象,this 指向 和作用域链。

变量对象包括 函数的形参,函数声明和变量声明

作用域链(scope chain) 其实作用域链类似于原型链,像一条锁链将作用域关联起来,如果这个变量在当前作用域中没有,它会寻找父级的,直到最顶层,如果没有找到就会报错。

参考地址: https://leohxj.gitbooks.io/front-end-database/content/javascript-advance/scope-chain.html http://blog.rainy.im/2015/07/04/scope-chain-and-prototype-chain-in-js/

严格相等运算符和相等运算符的 比较规则

===

  • 如果两个值类型不相等,则它们不相等
  • 如果两个值都是null或者undefined,则它们不相等
  • 如果两个值都是布尔值true或者false,则它们相等
  • 如果其中一个是NaN,或者两个都是NaN,则它们不等
  • 如果两个值为数字且相等,则它们相等。如果一个值为0,另一个为-0,则它们同样相等
  • 如果是两个字符串,必须长度和内容都相同,才相等
  • 如果两个引用值指向同一个对象,数组或函数,则它们相等。

==

  • 如果两个操作数的类型相同,则和严格相等运算符的比较规则一样。如果严格相等,那么比较结果相等,如果它们不严格相等,则比较结果不等
  • 如果两个操作数类型不同,检测相等会有如下规则
    • 如果一个数值为null,另一个是undefined,则它们相等。
    • 如果一个为数字,另一个为字符串,先将字符串转换成数字,然后再比较
    • 如果其中一个值是true,则将其转换成1,再比较,如果是false,则转换成0再比较
    • 如果一个值是对象,另一个值是数字或字符串,按之前的提到的规则转成原始值再比较。
    • 其他不同类型之间的比较均不相等

为了可以直观的比较严格相等运算符和相等运算符的区别,可以参看下面链接中的表格: https://dorey.github.io/JavaScript-Equality-Table/

关于 X!==X

X 只能是 NaN

关于eval

很多规范说是eval is evil,自己也就人云亦云,没有深究过,但是到底eval是不是evil,看了P84页,其实我本人觉得eval还是不错,只不过有时候有些调皮吧了,当你掌握它的脾气的时候,在某些特定的场合下,应该还是蛮不错的。

避免eval的以下缺点,应该还是不错的东西

  • 不要对eval赋予别名,通过别名调用eval时,会按全局来执行,会覆盖或定义新的全局变量和函数。
  • 尽量在函数中使用eval,将其影响控制在当前函数内。
  • eval的性能问题,这个取决于实际应用场景

其实我们也可以使用Function构造函数去动态执行代码

var test = new Function(‘name, age’, ‘console.log(name, age));
test(‘hjzheng’, 30);

很喜欢知乎上的答案 https://www.zhihu.com/question/20591877

关于typeof运算符

typeof,只能判断一部分类型,推荐大家使用({}.toString).call

为什么,请参考我之前写的对比表格 https://github.com/hjzheng/JavaScript-Test-Type-Table

Switch Case 语句用的是严格等于运算符

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment