Jimmy小站
小明也有大梦想 — 蒋明/铭javascript的闭包
2016-06-25 / 前端开发笔记 / 3687 次围观 / 0 次吐槽首先,作为javascript与其他编程语言最大区别的地方就是 函数的闭包。
这里我说明一下我对javascript闭包的理解。所谓闭包,就是包含所需必要元素的全集。比如在一个function内,需要用到某一个变量,系统会通过各种途径搜寻,直到找到该变量(因此,在function中嵌套function 就相当于使用了函数闭包功能)。
首先从本地环境中查找,如果没有找到则一层一层的向外层环境中查询。因此内部的function可以不需要显式传参,就可以使用外部变量。(比如你需要在学校教务处盖章,但是学校教务处要求必须先在学院教务处签字,一般的编程语言的做法是必须要你先去学院签字,而javascript的做法是他直接拿着你的单子,让学院教务处签好字,然后自己盖好章,最后直接把单子给你。他的工作包含了所有你必须要完成的所有任务。即你不需要显式传参,他会帮你在外层环境中找到所需的变量)
这样的做法对于编程来说,能够省去许多不必要的麻烦,这也是javascript的特点之一。但是这样的参数引用也有很多的缺陷。因为对于这样的传参方式,不管是不是对象类型的变量,都使用引用形式传参。如果内部多次修改并返回该变量,会使得所有返回值都是一样的,因为他们返回的是同一个地址空间存放的变量。示例如下,我们需要的是t2的结果,所以我们需要显式传参,避免对于所有返回值是同一个引用。
function createFunctions () { var resul = new Array(); for (var i = 0; i < 10; i++) { resul[i] = function(){ return i; } } return resul; } function createFunctions2 () { var resul = new Array(); for (var i = 0; i < 10; i++) { resul[i] = function(num){ return function(){ return num; } }(i); //匿名函数传参的写法,将i赋值给num } return resul; } function test () { var resul = createFunctions(); var t = []; var resul2 = createFunctions2(); var t2 = []; for (var i = 0; i < resul.length; i++) { t.push(resul[i]()); } for (var i = 0; i < resul2.length; i++) { t2.push(resul2[i]()); } //alert("createFunctions :" + t); //alert("createFunctions2 :" + t2); document.getElementById("t").innerHTML = "createFunctions :" + t; // createFunctions :10,10,10,10,10,10,10,10,10,10 document.getElementById("t2").innerHTML = "createFunctions2:" + t2; // createFunctions2:0,1,2,3,4,5,6,7,8,9 }
推荐您阅读更多有关于“js,”的文章
本月热文
Copyright © Jimmy小站 Allrights Reserved.备案号:桂ICP备 15005996
额 本文暂时没人评论 来添加一个吧
发表评论