JavaScript中的闭包介绍_Javascript教程-查字典教程网
JavaScript中的闭包介绍
JavaScript中的闭包介绍
发布时间:2016-12-30 来源:查字典编辑
摘要:所谓的闭包应该是指:内部函数读取当前函数以外的变量,即创建时所处的上下文环境。复制代码代码如下:functionhello(){varcha...

所谓的闭包应该是指: 内部函数读取当前函数以外的变量,即创建时所处的上下文环境。

复制代码 代码如下:

function hello(){

var char = "hello,world";

function print(){

console.log(char);

};

return print();

}

需要注意的是这里的print函数引用了外部hello函数的char变量,于是在这里我们能够返回一个

复制代码 代码如下:

hello,world

而这个功能在某种意义上来说,应该是要归功于作用域。当然了,我们没有办法直接访问char,除非是我们声明这个变量的时候出错了。如

复制代码 代码如下:

function hello(){

char = "hello,world";

function print(){

console.log(char);

};

return print();

}

仅仅是因为少了个var。

复制代码 代码如下:

在这里hello变成一个闭包 了。 闭包是一种特殊的对象。它由两部分构成:函数,以及创建该函数的环境。环境由闭包创建时在作用域中的任何局部变量组成。

Javscript 闭包与this

需要注意的是读取this与arguments时,可能是会出问题的。

复制代码 代码如下:

function hello(){

this.char = "hello,world";

function output(){

char = "I'm no hello world";

console.log(this.char);

};

return output();

}

当然了这个例子并不够贴切,so,我们需要一个额外的例子来解释这个问题,下面引用一个《Javascript高级程序设计》中的一个例子,来说明这个问题。

复制代码 代码如下:

var name = "The window";

var object = {

name: "My Object",

getNameFunc: function(){

return function(){

return this.name;

}

}

};

object.getNameFunc()()

只是这种用法实在是,而解决方法便是保存一个临时变量that,如之前在《关于Javascript的this的一些知识》一文中所说的。

复制代码 代码如下:

var name = "The window";

var object = {

name: "My Object",

getNameFunc: function(){

var that = this;

return function(){

return that.name;

}

}

};

object.getNameFunc()()

Javscript 闭包与读写变量

值得注意的是,如果我们没有处理好我们的变量时,我们也可以修改这些变量。

复制代码 代码如下:

function hello(){

var char = "hello,world";

return{

set: function(string){

return char = string;

},

print: function(){

console.log(char)

}

}

}

var say = hello();

say.set('new hello,world')

say.print() // new hello world

Javascript 闭包与性能

引用MDC的说法

复制代码 代码如下:

如果不是因为某些特殊任务而需要闭包,在没有必要的情况下,在其它函数中创建函数是不明智的,因为闭包对脚本性能具有负面影响,包括处理速度和内存消耗。

文上还说到。

复制代码 代码如下:

例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中。原因是这将导致每次构造器被调用,方法都会被重新赋值一次(也就是说,为每一个对象的创建)。

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新Javascript教程学习
    热门Javascript教程学习
    编程开发子分类