Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

属性与变量 #14

Open
CoolRabbit520 opened this issue Mar 13, 2018 · 0 comments
Open

属性与变量 #14

CoolRabbit520 opened this issue Mar 13, 2018 · 0 comments

Comments

@CoolRabbit520
Copy link
Owner

相似点

window作为全局对象,全局变量和函数都是作为window对象的属性和方法创建的。所以,变量也可以看做是当前执行环境的变量对象的一个属性。

属性是引用类型值才具有的,声明时不需使用var声明,访问属性只用通过.[ ]两种方法。

区别

  1. 使用var声明的全局变量不能通过delete操作符删除,没有使用var声明的变量可以被删除。
var a =5;
b = 4;  // equal to windows.b = 4
alert(delete a); // false
alert(delete b); // true

2.使用var声明的全局变量会被提升,而不用var声明的全局变量不会被提升。例如:

alert(a);
var a=1;

alert(a);//error, a undefined
a=1;

3.属性查找是延着原型链进行的,所有的对象,其原型链最终会是Object.prototype,再向上就是null了。

变量的查找是延着作用域链进行的,作用域链可以简单地看成函数间的包含关系,被包含的函数中不存在某个变量时,在包含他的函数中查找,直到全局作用域。

相关

1.在函数中遇到没有var声明的变量

  • 沿着作用域链搜寻该标识符
    • 如果在局部环境中找到,则停止搜索过程,并对该变量赋值。
    • 如果在局部环境中没有找到,继续沿着作用域链向上搜索,直到全局环境中的变量对象。
    • 如果在全局环境找那个也没有找到这个标识符,则意味着该变量未声明。
  • 如果没有找到该属性,在全局对象(即当前作用域链的最顶层对象,如window对象)中创造该属性并赋值。
  • 在搜索过程中没如果局部环境中存在着同名标识符,就不会使用位于父环境中的标识符。

2.在全局环境中遇到没有var声明的变量

  • 在全局环境中查询该变量是否声明。
  • 如果有变量声明,则执行赋值操作
  • 如果没有变量声明,则为Window创建一个属性并赋值。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant