You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
vara=1;functionfn1(a){vara=2;console.log(a);}console.log(a);fn1(3);//变形1"// var a =1;// function fn1(a){// console.log(a);// var a =2;// console.log(a);// }// console.log(a);// fn1(3);//变形3:// var a =1;// function fn1(a){// console.log(a);// a=4;// console.log(a);// }// console.log(a);// fn1(3);// console.log(a);//放在不同的script标签里varo2='the second script';console.log(o);
var a=1;
function fn1(){
console.log(a); //第一个a 输出什么
var a=2;
function fn1_1(){
var a=3;
console.log(a); //第二个a 输出什么
}
console.log(a); //第三个a输出什么
fn1_1();
}
fn1();
##JS中作用域和原型链
2017-07-04
####1.作用域:
概念:
作用域:
首先我们需要了解的是作用域做什么的?
当JavaScript引擎在某一作用域中遇见变量和函数的时候,需要能够明确变量和函数所对应的值是什么,所以就需要作用域来对变量和函数进行查找,并且还需要确定当前代码是否对该变量具有访问权限
。也就是说作用域主要有以下的任务:收集并维护所有声明的标识符(变量和函数)
依照特定的规则对标识符进行查找
确定当前的代码对标识符的访问权限
来个例子:
作用域链;
代码可以访问当前的作用域的变量,对于嵌套的父级作用域中的变量也可以访问
。我们知道JavaScript在ES5中是没有块级作用域的,只有函数可以创建块作用域。``当引擎执行到函数Inner内部的时候,不仅可以访问当前作用域而且可以访问到Outer的作用域,从而可以访问到标识符outer。因此我们发现当多个作用域相互嵌套的时候,就形成了作用域链。词法作用域在查找标识符的时候,优先在本作用域中查找。如果本作用域没有找到标识符,会继续向上一级查找,当抵达最外层的全局作用域仍然没有找到,则会停止对标识符的搜索。`
看个更加复杂一点的例子:
关于作用域的总结:
词法作用域在查找标识符的时候,优先在本作用域中查找。如果本作用域没有找到标识符,会继续向上一级查找,当抵达最外层的全局作用域仍然没有找到,则会停止对标识符的搜索。
###2. 原型链
首先来看Number函数: Number()
原始类型的值主要是字符串、布尔值、undefined和null,它们都能被Number转成数值或NaN。
####2)对象的转换规则
规则是:
Number方法的参数是对象时,将返回NaN,除非是包含单个数值的数组。
Number背后对于对象的转换比较复杂:
1.调用对象自身的valueOf方法。如果返回原始类型的值,则直接对该值使用Number函数,不再进行后续步骤。
2.如果valueOf方法返回的还是对象,则改为调用对象自身的toString方法。如果toString方法返回原始类型的值,则对该值使用Number函数,不再进行后续步骤。
3.如果toString方法返回的是对象,就报错。
所以:
除此之外:
valueOf和toString方法,都是可以自定义的。
正式进入原型链:
对于有基于类的语言经验的开发人员来说, JavaScript 有点令人困惑 (如Java或C ++) ,因为它是动态的,并且本身不提供一个类实现.。(在ES2015/ES6中引入了class关键字,但只是语法糖,JavaScript 仍然是基于原型的)。
当谈到继承时,Javascript 只有一种结构:对象。
每个对象都有一个私有属性(称为是[[Prototype]]), 它持有一个连接到另一个称为其 prototype 对象的链接。该原型对象具有一个自己的原型,等等,直到达到一个对象的 prototype 为 null。
根据定义,null 没有 prototype,并作为这个 prototype chain 中的最后一个环节。
Object是Function,Array,String,RegExp 的父类,Object是上帝类
作用域链和原型链的比较:
讲完了作用域链和原型链,我们可以比较一下。
作用域链的作用主要用于查找标识符,当作用域需要查询变量的时候会沿着作用域链依次查找,如果找到标识符就会停止搜索,否则将会沿着作用域链依次向后查找,直到作用域链的结尾。而原型链是用于查找引用类型的属性,查找属性会沿着原型链依次进行,如果找到该属性会停止搜索并做相应的操作,否则将会沿着原型链依次查找直到结尾。
拓展__proto__ 和prototype:
huangtengfei/blog#11
参考链接:
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/ JavaScript. The core.
http://www.ecma-international.org/ecma-262/5.1/#sec-4.3.5 ESCMA5官网
http://dmitrysoshnikov.com/tag/ecma-262-3/ 强
creeperyang/blog#9
http://www.th7.cn/web/js/201503/88712.shtml
huangtengfei/blog#11
The text was updated successfully, but these errors were encountered: