闭包和引用,this引用的简单介绍……
<script type="text/javascript">
var a = "1";
var b = a;
b = "2";
alert(a);
//这里a是非对象,所以b = a 的时候,是把a引用的值拷贝了一份,然后直接给b,所以修改b的时候当然不会改变a
var a = {};
a.name = "w";
var b = a;
b.name = "c";
alert(a.name);
/*
这里a是对象,所以b = a 的时候,是把a的引用copy了一份,然后给b,又因为修改b.name
是通过b引用的对象,修改对象的成员,所以修改b.name的时候a也被修改了。。因为它们的引用相同即某无知的对象。。
但是如果你直接b = xxxx,这样就不会影响到a的引用对象,因为b的引用和a是一样的,你只是把b的引用改变了,
而不是通过b引用的对象去修改里面的成员。。。所以a的引用对象不会受到影响。。。
即
*/
b = "wc";
alert(a);
/*
下面介绍this的引用,this的引用是执行的那个函数 . 之前的对象比如。。。
wc.func();
这样this的引用就指向wc
如果是
func();
这种形式都可以认为是window.func();
所以它们的this的引用自然就是window;
下面小段code
*/
window.name = "window";
var a = {};
a.name = "a";
a.func = function () {
alert(this.name);
};
a.func(); //a
var b = {};
b.name = "b";
b.func = a.func; //这里是把a.func的那个函数的引用copy了一份给b.func
b.func(); //b
var c = a.func;
c(); //window
//关于引用的介绍到此:D
</script>
闭包:
闭包其实就是执行一个函数后,资源不会释放。。。
一般是函数里提供了一些资源,当函数执行完毕后,这些资源外面还会用到(函数之外存在引用)
嗯,我坚信code最有说服力。。。:D
<script type="text/javascript">
var a = function (i) {
return function () {
alert(i);
};
};
var b = a("内容"); //这里i变量被保留了所以产生了闭包;
alert(b);
b(); //内容
//下面介绍下prototype.js里的bind方法
Function.prototype.bind = function () {
//绑定事件
var wc = this, a = $A(arguments), o = a.shift();
return function () {
wc.apply(o, a.concat($A(arguments)));
};
};
/*
$A方法,就是相当于Array.call(null, arguments),注意arguments对象不是数组对象,只不过它有length属性和0-n属性而已。。。
又因为它有这些属性,并且还可写。。。所以可以用Array.call方法来改成数组
其实就是等同于
var $A = function () {
for (var a = [], i = 0 ; i < arguments.length ; i ++) a[i] = arguments[i];
return a;
};
var wc = this, a = $A(arguments), o = a.shift();
这句就是把arguments转换成数组给a.
var wc = this;
因为这个是原型-prototype(关于原型后面会有文章介绍)下的方法,所以,所有函数对象都会被继承。。。
可以测试下面代码:
*/
Function.prototype.wc = function () {
alert(this);
};
var f = function () {
alert(1);
};
f.wc(); //function () { alert(1); }
//即
Function.prototype.wc = function () {
var wc = this;
return function () {
alert(wc);
};
};
var n = f.wc();
n(); //function () { alert(1); }
/*
wc.apply(o, a.concat($A(arguments)));
*/
</script>
下面展示一个很简单的闭包实例:
(以AJAX取的JSON数据后,生成表格,并在相应的td位置上增加onclick事件)
var td_0 = document.createElement('td');
td_0.innerHTML = _json[i]["group_name"];
td_0.onclick = function (_i)
{
return function ()
{
getMember(_json[_i]["group_id"]);
};
}(i );
分享到:
相关推荐
本文结合 ECMA 262 规范详解了闭包的内部工作机制,让 JavaScript 编程人员对闭包的理解从“嵌套的函数”深入到“标识符解析、执行环境和作用域链”等等 JavaScript 对象背后的运行机制当中,真正领会到闭包的实质。
JavaScript 闭包究竟是什么? 用JavaScript一年多了,闭包总是让人二丈和尚摸不着头脑。陆陆续续接触了一些闭包的知识,也犯过几次因为不理解闭包导致的错误,一年多了资料也看了一些,但还是不是非常明白,最近偶然...
闭包是ECMAScript (JavaScript)最强大的特性之一,但用好闭包的前提是必须理解闭包。闭包的创建相对容易,人们甚至会在不经意间创建闭包,但这些无意创建的闭包却存在潜在的危害,尤其是在比较常见的浏览器环境下...
Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态...本文将以例子入手来介绍Javascript闭包的语言特性,并结合一点 ECMAScript语言规范来使读者可以更深入的理解闭包。
本文将深入探讨JavaScript闭包的概念、工作原理及其常见用途。 首先,我们需要了解JavaScript的作用域。在JavaScript中,每个函数都有自己的作用域,即变量和函数的可见范围。全局作用域在整个程序中都是可访问的,...
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。
深入理解javascript原型和闭包(01)——一切都是对象 深入理解javascript原型和闭包(02)——函数和对象的关系
为了帮助大家快速和较好地理解JavaScript函数中的闭包,本文对JavaScript的闭包进行了分析并进行简易的代码演示,希望本文能够给有需要的人带来一点小小的帮助。
JavaScript 闭包与其他技术的结合 JavaScript 闭包技术可以与其他技术结合,例如 HTML5、CSS3、Ajax 等,以实现更加复杂和智能的 Web 应用程序。 JavaScript 闭包的优点 1. 可以保护函数的变量安全 2. 可以在内存...
### JavaScript闭包完整解释 #### 一、闭包的基本概念 **闭包**是一个非常重要的JavaScript概念,它指的是一个函数能够记住并访问其外部作用域中的变量的能力,即使该函数在其外部作用域之外被调用也是如此。具体...
基于JavaScript闭包的Web图片浏览控件的实现 本文主要讲解了基于JavaScript闭包原理的Web图片浏览控件的实现,包括JavaScript闭包概念、闭包应用场景、Web图片浏览控件的设计思路和实现方法。 1. JavaScript闭包...
深入理解JavaScript的闭包技术整理.pdf
资源名称:javascript闭包详解 中文word版 内容简介: Javascript中有几个非常重要的语言特性——对象、原型继承、闭包。其中闭包 对于那些使用传统静态语言C/C 的程序员来说是一个新的...
标题《JavaScript闭包的理解》涉及的知识点主要围绕JavaScript编程中的一个重要概念——闭包。闭包是一个高级且复杂的话题,它是JavaScript语言的核心特性之一,同时也是一大难点。要想熟练运用JavaScript,掌握闭包...
在JavaScript编程中,闭包是一个核心概念,它允许函数记住并访问所在词法作用域,即使当函数在其词法作用域之外执行时。闭包的特性使得它在JavaScript中既神秘又强大。 首先,我们从闭包的定义谈起。在JavaScript中...
JavaScript中的闭包是一种重要的编程概念,它涉及到函数、作用域和变量持久化等多个方面。闭包的本质是一个函数,它可以访问并操作其外部作用域的变量,即使在其外部作用域已经结束之后仍然能保持对这些变量的引用。...
javascript闭包详解 javascript闭包详解 javascript闭包详解
JavaScript 闭包是一种高级编程概念,它在JavaScript中扮演着至关重要的角色,特别是在函数式编程和模块化设计中。闭包本质上是函数和其能够访问...通过学习这些实例,你将能够更好地掌握JavaScript闭包这一核心概念。