今天我们来谈谈计算机编程的作用域的问题和理解。
计算机在解读我们编写的代码时,也就是高级语言时,它会有一个编译,执行的过程,来翻译我们的高级语言,转化为二进制。在编译的时候,js引擎会在构造函数创建对象时,会产生原型来提高我们的运算效率,把共同的方法和属性挂载在原型上。来让不同的对象的实例来通过自动生成的原生链去访问原型的方法和属性。也就是通过内部的原型指针_proto_来一级一级的去寻找。当然,先把父级的对象实例替换成子级的原型。这是我们常用的原生链来继承。计算机在解读我们的编码时,会按照一定的顺序来解释。这个解读代码顺序是非常重要的。是我们看不见的机制。这是最基本的原理。首先是,计算机也就是js引擎先把全局变量的定义的操作先提升到顶部,只是提升的定义,不会提升定义的值和调用。然后,再执行到具体的局部作用域时,就会把具体作用域的定义的操作来提升到具体的作用域顶部。请看下面的例子。
alert(a); // 在全局作用域下,计算机首先是把全局的定义的变量来提升到顶部,只是定义的操作,所以,弹出的是undefinde;这是变量的提升的机制来帮助计算机提高效率。
var a = 12;
for (var i = 0;i<10;i++) {
var a = i; //
}
function change () {
alert(a);
var a = 90;
var b = 0;
}
var c = 59;
alert(change ());
我们可以类比的学习原型链的寻找模式,来理解作用链的寻找模式。
作用域链的寻找模式是从当前的作用域出发点,往上来寻找。寻找变量的。
var a =10;
for (var i =0;i<10;i++) {
var a = i;
}
alert(a); // 注意是9.
这个题就是考证的作用域的机制。首先,js没有块级的概念。因此,for循环的i循环变量就是全局变量。在循环中,i的值等于9的时候,循环体就停止了。i给a的赋值就停止了。所以,a的值就是9.在执行alert时,又给a开辟新的空间,访问的是第二个a的空间保存的值。就是9了。
网友评论