首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >范围链查找与原型查找-这是当

范围链查找与原型查找-这是当
EN

Stack Overflow用户
提问于 2014-12-11 23:28:53
回答 1查看 2.7K关注 0票数 14

如果某个变量在需要时在函数中不可用,则在作用域链中查找它(这是一个闭包),但其他时候则在原型链中搜索它。我想把我的头绕在什么时候发生的事上。我想知道是否有人能帮我清除迷雾,或者给我参考一些专门讨论这个话题的文献。

例如,我是否正确地说:-对象以及与上下文相关的公共变量(此)总是在原型链中查找?-私有变量总是在作用域链中查找(即执行上下文中的函数链)?-程序在这两种情况中都在查找吗?

我测试了三种不同的场景(范围链查找、原型查找和不查找),但不幸的是,它没有足够的帮助找到这个问题的根源。

代码语言:javascript
运行
复制
    var Food = function(){
    var t = 1;  // for closure

    this.timeToPrepare = function(){    // Scope chain lookup
        console.log(t * 3);
    };

    this.timeToMake = function(){   // This is looked up in the prototype chain
        console.log(this.t * 3);
    };

    this.timeToEat = function(t){   //No lookup
        console.log(t * 3);
    };

    };

    Food.prototype.t = 2;

    (function(){
    var pizza = new Food;
    pizza.timeToPrepare();  //3
    pizza.timeToMake();     //6
    pizza.timeToEat(3);     //9
    })();

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-12 00:30:47

在作用域链上查找变量,从当前的执行上下文开始,然后向上遍历包围执行上下文的树。

首先在基本对象上查找属性,然后在该对象的[[Prototoype]]链(即内部原型)上查找。

所以如果你这么做了:

代码语言:javascript
运行
复制
foo

foo将被视为变量,并在作用域链上查找。变量名从不限定,您不能将它们指向要查找的特定执行上下文。如果作用域链上有两个相同名称的变量,则只能访问在沿着该链运行时第一次遇到的变量(对于全局变量,有一种方法可以这样做)。

代码语言:javascript
运行
复制
var a = 'global a';

function foo() {
  var a = 'local a';
  return a;
}

console.log(foo()); // local a

在上面,函数中的a解析为局部变量a。在全局变量的情况下,它们是全局对象的属性,因此即使它们被同一个命名的本地属性“阴影”,也可以访问它们。

代码语言:javascript
运行
复制
function foo() {
  var = 'local a';
  // this will reference the global object
  return this.a;
}

console.log(foo()); // global a

相反,属性名称的前面总是有一个查找它们的基对象(如上面的示例,其中引用了全局对象),例如,

代码语言:javascript
运行
复制
foo.bar

将被分割成foo和bar。首先,foo将在作用域链上解析,如果找到,属性解析将尝试查找bar属性。因此,对于属性,您可以指示查找该属性的对象。因此,如果有两个具有相同命名属性的对象,那么只要两个对象都在作用域中,就可以查找这两个属性。

因此,任何引用的第一部分都被视为变量,随后的部分则被视为属性。除非使用with,但这是不鼓励的。别去那儿。

但为了完整性,…将指定的对象放置在开始作用域链上,以便在使用范围链之前首先将变量作为该对象的属性查找,因此您可以这样做:

代码语言:javascript
运行
复制
var cos = function(arg){return 'my cos function: ' + arg};

function foo() {

  // cos is resolved on the scope chain
  console.log(cos(0.5));  // my cos function: 0.5

  with (Math) {
    // cos is first resolved as a property of Math, and only on the
    // scope chain if not found there
    console.log(cos(0.5)) // 0.8775825618903728
  }
}

foo();
票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27434357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档