JS闭包、作用域链的问题

问题描述

var name = "The Window";  var object = {    name : "My Object",    getNameFunc : function(){      return function(){ alert(this);        return this.name;      };    }  };  alert(object.getNameFunc()());//输出The Window var name1 = "The Window";  var object1 = {    name : "My Object",    getNameFunc : function(){      alert(this); var that = this;      return function(){        return that.name;      };    }  };  alert(object1.getNameFunc()());//输出My Object上面的this为window对象,而下面的this为什么是object1对象,求当中的详细讲解,小子不胜感激 问题补充:疑惑,睡不着觉。。。

解决方案

很简单,你要先明白这句底发生了什么。object1.getNameFunc()()这句可以简单的拆分成两步调用:var anyFuc = object1.getNameFunc();anyFuc();第一步在作用域对象object1上调用getNameFunc函数返回一个Function对象;第二步在全局作用域上(window)直接调用这个函数对象。这样:第一种写法下,最终获得的name是在全局对象window下的name;第二种写法下,先在getNameFunc中使用anyFuc的闭包保存了它的作用域object1作为that变量,然后在anyFuc中直接访问的是它,自然最终获得是object1的name

时间: 2024-08-01 14:52:12

JS闭包、作用域链的问题的相关文章

JS闭包、作用域链、垃圾回收、内存泄露相关知识小结_javascript技巧

补充: 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 闭包的特性 闭包有三个特性: 1.函数嵌套函数 2.函数内部可以引用外部的参数和变量 3.参数和变量不会被垃圾回收机制回收 闭包的定义及其优缺点 闭包 是指有权访问另一个函数作用域中的变量的函数,创建闭包的最常见的方式就是在一个函数内创建另一个函数,通过另一个函数访问这个函数的局部变量 闭包的缺点就是常驻内存,会增大内存使用量,使用不当很容易造成内存泄露. 闭包是javascript

浅析JavaScript作用域链、执行上下文与闭包_javascript技巧

闭包和作用域链是JavaScript中比较重要的概念,这两天翻阅了一些资料,把相关知识点给大家总结了以下. JavaScript 采用词法作用域(lexical scoping),函数执行依赖的变量作用域是由函数定义的时候决定,而不是函数执行的时候决定.以下面的代码片段举例说明,通常来说(基于栈的实现,如 C 语言) foo 被调用之后函数内的本地变量 scope 会被释放,但是从词法上看 foo 的内嵌匿名函数中 scope 应该指的是 foo 的本地变量 scope ,并且实际上代码的运行结

Javascript闭包之作用域链示例

把再高一级函数中的变量放在更后面,以此类推直至全局对象为止.当函数中需要查询一个变量的值的时候,js解释器会去作用域链去查找,从最前面的本地变量中先找,如果没有找到对应的变量,则到下一级的链上找,一旦找到了变量,则不再继续.如果找到最后也没找到需要的变量,则解释器返回undefined. 作用域 JavaScript 中有两种作用域:函数作用域和全局作用域. 在一个函数中声明的变量以及该函数的参数享有同一个作用域,即函数作用域.一个简单的函数作用域的例子: function foo() { va

JS函数的作用域链的一点问题

问题描述 JS函数的作用域链的一点问题 1.能否细说一下,函数创建.执行时,执行环境.作用域链.活动对象.局部变量的具体执行过程? 2.另外,作用域链是针对谁的概念,是针对执行环境,还是变量对象?作用域链中包含什么? 3.执行函数时,是先复制函数的作用域链,根据其内容确定作用域的范围,再创建局部执行环境,还是先创建一个局部环境,再复制函数的作用域链,构建执行环境的作用域链? 解决方案 js的作用域链理解js的变量作用域 ,函数名,变量名覆盖问题

javascript-JS如何延长作用域链?

问题描述 JS如何延长作用域链? 1.JS的with语句如何延长作用链?如下一段代码: function buildURI(){ var qs = '?debug = true'; with(location){ var url = href + qs; } return url; } alert(buildURI()); url如何会在with语句外面就能被调用?它不是location对象的属性吗?href是否跟url一样,也可以被外面的访问? 2.try-catch语句呢? 3.还有没有其他

浅析JavaScript中的变量复制、参数传递和作用域链_javascript技巧

今天在看书的过程中,又发现了自己目前对Javascript存在的一个知识模糊点:JS的作用域链,所以就通过查资料看书对作用域链相关的内容进行了学习.今天学习笔记主要有这样几个关键字:变量.参数传递.执行环境.变量对象.作用域链. 1.变量 变量需要注意的有两点:变量声明和复制变量值. 变量声明肯定大家都很熟悉,在JS中我们都是通过 var 关键字进行变量声明的.JS中规定,通过var声明的变量会被添加到最近的环境中,如果声明并且初始化一个变量没有用到var关键字,这个变量会被添加到全局环境中.

javascript作用域链(Scope Chain)用法实例解析_javascript技巧

本文实例分析了javascript作用域链(Scope Chain)用法.分享给大家供大家参考,具体如下: 关于js的作用域链,早有耳闻,也曾看过几篇介绍性的博文,但一直都理解的模棱两可.近日又精心翻看了一下<悟透Javascript>这本书,觉得写得太深刻,在"代码的时空"一节里有一段介绍作用域链的地方寥寥数语,回味无穷(其实还是理解的模棱两可^_^).现在整理下自己的读书笔记,顺便借鉴网上资源,写下来. 一.从一个简单的问题说起 下面的js代码在页面中运行显示什么结果:

js闭包引起的事件注册问题介绍_基础知识

背景:闲暇时间看了几篇关于js作用域链与闭包的文章,偶然又看到了之前遇到的一个问题,就是在for循环中为dom节点注册事件驱动,具体见下面代码: <!DOCTYPE html> <html> <head> <title>js闭包</title> <meta charset="utf-8" /> </head> <body> <button id="anchor1"&

JavaScript 作用域链解析

  JavaScript中有Scope(作用域),Scope chain(作用域链),Execute context(执行上下文),Active Object (活动对象),Dynamic Scope(动态作用域),Closure(闭包)这些概念,要理解这些概念,我们从静态和动态两个方面去分析一下. 首先我们写一个简单的function来做一个例子: 代码如下: function add(num1, num2){ var sum = num1 + num2; return sum; } 我们定义

浅析JavaScript中作用域和作用域链_javascript技巧

学习js,肯定要学习作用域,js作用域和其他的主流语言的作用域还存在很大的区别. 一.js没有块级作用域. js没有块级作用域,就像这样: if(){ var a = 100: console.log(a) //输出100 } console.log(a) //输出100 js中像if,for,switch之类的语句,他们包含的代码块里面的变量,在代码块外面也能被读取,所以说,js没有块级作用域. 二.js的全局变量 js中规定,全局变量都可以看作是window的属性,而且全局变量能够被所有的代