作用域链 Scope Chain

Object.prototype.x = 10;

var w = 20;
var y = 30;

//console.log(x); // 10

(function foo() {
  var w = 40;
  var x = 100;

  with ({z: 50}) {
    console.log(w, x, y , z); // 40, 10, 30, 50
  }

  console.log(this.x, this.w); // 10, 20

  console.log(window.w); // 20

})();

  

Object.prototype.x = 10;

var w = 20;
var y = 30;

//console.log(x); // 10

(function foo() {
  var w = 40;
  var x = 100;

  with ({z: 50}) {
    console.log(this.w, this.x, this.y , z); // 20, 10, 30, 50
  }

  console.log(x, w); // 100, 40

  console.log(window.w); // 20

})();

  

在搜索__parent__ 之前先搜说 __proto__

闭包函数

Object.prototype.x = 10;

var w = 20;
var y = 30;

//console.log(x); // 10

(function foo() {
  var w = 40;
  var x = 100;

  (function(){
   console.log(w, x, y); //40,100,30
})();

})();

 

因为with会在运行期间产生临时的作用域,而闭包函数还是在foo的作用域内。

原文:http://www.nowamagic.net/librarys/veda/detail/1645

时间: 2024-10-29 16:05:12

作用域链 Scope Chain的相关文章

深入理解JavaScript系列(14):作用域链(Scope Chain)

前言 在第12章关于变量对象的描述中,我们已经知道一个执行上下文 的数据(变量.函数声明和函数的形参)作为属性存储在变量对象中. 同时我们也知道变量对象在每次进入上下文时创建,并填入初始值,值的更新出现在代码执行阶段. 这一章专门讨论与执行上下文直接相关的更多细节,这次我们将提及一个议题——作用域链. 英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-4-scope-chain/ 中文参考:http://www.denisdeng.com/?p

JS_ 垃圾回收、变量与属性、作用域链

1.垃圾回收 js的垃圾回收机制不同于java,c等语言需要手工回收,js中的垃圾回收是自动启动的,大致过程:js解释器会判断一个对象是否是可达的,即是否有变量指向它,没有,则启动回收机制,释放该对象占用的内存,eg: 1 var s = "hello world"; 2 var s2 = s.toUpperCase();//创建新字符串:"HELLO WORLD" 3 s2 = s;//"hello world"没有变量指向,占用内存被释放 这

JavaScript---闭包和作用域链

作用域和作用域链: 参考文章 :http://www.cnblogs.com/malinlin/p/6028842.html  http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html  http://www.zhangyunling.com/?p=134 总结:  ① js中处处是对象 ②函数执行时会创建一个执行环境和变量对象 ③代码在执行环境中运行 变量对象会按照顺序存到作用域链中 ④执行一次函数就

关于Javascript作用域及作用域链的总结

本文是根据以下文章以及<Javascript高级程序设计(第三版)>第四章相关内容总结的. 1.Javascript作用域原理,地址:http://www.laruence.com/2009/05/28/863.html 2.JavaScript 开发进阶:理解 JavaScript 作用域和作用域链,地址:http://www.cnblogs.com/lhb25/archive/2011/09/06/javascript-scope-chain.html 在介绍有关作用域的内容之前,先来介绍

(第四天)作用域链、闭包

前言 JavaScript是基于词法作用域的语言:通过阅读包含变量定义在内的数行源码就能知道变量的作用域.全局变量在程序中始终都是有定义的.局部变量在声明它的函数体内以及其所嵌套的函数内始终是有定义的. 如果将一个局部变量看做是自定义实现的对象的属性的话,那么可以换个角度来解读变量作用域.每一段JavaScript代码(全局代码或函数)都有一个与之关联的作用域链(scope chain).这个作用域链是一个对象列表或者链表,这组对象定义了这段代码“作用域中”的变量.当JavaScript需要查找

JavaScript作用域原理(一)——作用域链

一.作用域的描述 JavaScript权威指南中对作用域有一句很精辟的描述:“JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里.” 在JavaScript中,作用域的概念和其他语言差不多,在每次调用一个函数的时候,就会进入一个函数内的作用域,当从函数返回以后,就返回调用前的作用域. 验证下刚那句权威指南中的话: <p id="scope1" style="color:red"></p> function ec

(好文推荐)一篇文章看懂JavaScript作用域链

闭包和作用域链是JavaScript中比较重要的概念,首先,看看几段简单的代码. 代码1: 1 var name = "stephenchan"; 2 var age = 23; 3 function myFunc() { 4 alert(name); 5 var name = "endlesscode"; 6 alert(name); 7 alert(age); 8 alert(weight); 9 } 10 myFunc(); 11 myFunc(); 上述代码

JavaScript变量作用域(Variable Scope)和闭包(closure)的基础知识

在这篇文章中,我会试图讲解JavaScript变量的作用域和声明提升,以及许多隐隐藏的陷阱.为了确保我们不会碰到不可预见的问题,我们必须真正理解这些概念. 基本定义 作用范围是个“木桶”,里面装着变量.变量可以是局部或者全局性的,但在子范围中定义的变量是可以访问父范围的,这一点可能会造成一些困扰. 在JavaScript中使用"var"关键字声明变量.一旦在父范围宣声明,就会作为各自子范围的一部分.即在本地范围内有效,但本地定义的变量不可在全局范围内访问. 让我们来看一个例子.执行下面

JavaScript的作用域链

问题的提出 首先看一个例子: var name = 'laruence'; function echo() { alert(name); var name = 'eve'; alert(name); alert(age); } echo(); 运行结果是什么呢? 上面的问题, 我相信会有很多人会认为是: laruence eve [脚本出错] 因为会以为在echo中, 第一次alert的时候, 会取到全局变量name的值, 而第二次值被局部变量name覆盖, 所以第二次alert是’eve’.