美文网首页程序员让前端飞
JavaScript中访问属性和访问变量的标识符查找规则

JavaScript中访问属性和访问变量的标识符查找规则

作者: 科研者 | 来源:发表于2017-08-25 09:15 被阅读0次

相信很多人都能正确地访问属性和访问变量,但对于一些特性的问题(如本文中的第2部分< 未定义的变量与未定义的属性的访问 >)可能就不知其所以然了,造成这种情况的原因就是:对于这些知识,只是会用,但不理解;
为了帮助大家深入理解JavaScript中标识符查找过程,现给出规则和应用示例如下:(若想更深入地理解JavaScript的各种特性,可以参考另一篇文章:《JavaScript的发现与理解》)

1.标识符查找

  1. 访问属性,查找的是原型链;
  2. 访问变量,查找的是作用域链;

作用链是一个栈,栈里保存的是作用域对象,栈的最顶端是当前作用域对象,栈的最底端是全局作用域对象;
作用域对象只有2种:

  1. 全局作用域对象;
  2. 函数作用域对象;

所以当通过属性调用的方式调用对象的方法时,该对象只会成this的值;不会成为它的方法(即:对象中属性值是函数的属性)的作用域链中的作用域对象,不过可以通过with操作符使对象成为它的方法的作用域链中的作用域对象;

2. 未定义的变量与未定义的属性的访问

假设以下代码在全局作用域下执行,且gby和dyx都从未定义过,则执行结果如下:

gby;        //结果:报错:ReferenceError: Can't find variable: gby;
window.gby; //结果:undefined
window.dyx; //结果:undefined

所以:访问未定义的变量会报错,但访问未定义的属性不会报错,只是结果为undefined;
如果gby是全局变量,则gby 和 window.gby 访问的都是同一个变量,那为什么这两种访问方式的结果不一样呢?我认为原因如下:
访问变量时是通过搜索作用域链来查找变量的,而访问属性是通过搜索原型链来查找属性的,因为这两种访问方式的搜索方式不一样,所以导致了结果不一样;

相关文章

  • JavaScript中访问属性和访问变量的标识符查找规则

    相信很多人都能正确地访问属性和访问变量,但对于一些特性的问题(如本文中的第2部分< 未定义的变量与未定义的属性的访...

  • KVC/KVO的理解

    KVC KVC实现了基于KEY访问对象属性的一套查找规则,可以直接操作对象的属性,变量即使设置为私有的也一样访问。...

  • JavaScript 作用域

    在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象...

  • JavaScript作用域

    在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变量,对象...

  • JS 作用域和作用域链

    作用域 JavaScript 中的作用域是我们可以有效访问变量或函数的区域。作用域规定了如何查找变量,也就是确定当...

  • Basic Javascript

    Javascript访问属性值 使用 小圆点(.) 来访问 使用中括号操作符([]),如果你想访问的属性的名称有一...

  • javaScript作用域

    作用域为可访问变量的集合。 在javaScript中,对象和函数同样也是变量, 在javaScript中作用域为可...

  • 知识点

    js访问对象属性两种方式在javascript中我们通常使用.来访问对象的属性,那么也可以使用[ ]来访问对象属性...

  • ActionScript3.0基础(一)

    访问控制属性: public:公有属性 private:私有类型的变量和方法只允许定义它们的类访问,其他类访问报错...

  • 局部作用域

    作用域 在 JavaScript 中, 对象和函数同样也是变量。 在 JavaScript 中, 作用域为可访问变...

网友评论

    本文标题:JavaScript中访问属性和访问变量的标识符查找规则

    本文链接:https://www.haomeiwen.com/subject/ymaydxtx.html