说下闭包的由来
function a() {
var i = 0;
function b() {
console.log(i);
}
return b;
}
var c = a();
c();
一般来说,当一个函数内部匿名函数用到了自己的变量,并且这个匿名函数被返回了,这就建立了一个闭包,比如上面的代码
这个时候,就算a调用结束被销毁,i也会存在不会消失当a定义时,js解释器会将函数a的作用域链设置为定义a时所在环境当执行a时,a会进入相应的执行环境,执行环境创建后才会有作用域scope属
在js中数据的声明方式有两种:
1、用var声明,例如:var num = 10;
2、直接声明,例如:num = 10;
两种声明方式在某些情况下是有区别的:
var data = 10;
function fn01(){
var data = 100;
function fn02(){
data = 1000;
function fn03(){
data = 10000;
}
fn03();
}
fn02();
}
fn01();
调用对象位于作用域链的前端,局部变量(在函数内部用var声明的变量)、函数参数及Arguments对象都在函数内的作用域中——这意味着它们隐藏了作用域链更上层的任何同名的属性。 2010年9月14日,我去参加网易网页工程师招聘会,应聘JS工程师职位。有幸参加笔试,然后有幸栽在笔试,呵呵。废话少说,抓出音响极深的一题重新研究研究。 题目大概是:写出如下代码的输出结果并进行分析 代码如下: var tt = ‘aa’; function test(){ alert(tt); var tt = ‘d
本文实例为大家分享了JS作用域链的相关内容,供大家参考,具体内容如下
1、所有全局变量和函数都是作为window对象的属性和方法创建的。
2、在某个方法函数的作用域中,所有代码执行完之后,该作用域被销毁,保存在其中的所有变量和函数定义也会随着被”销毁“,这就是局部作用域。但闭包不会销毁局部变量。
这里的销毁:是指下次再执行此函数的时候,所有的变量又回到最初的状态
var color = "blue";
function changeColor(){
var anothercolor = "
作用域:函数在定义的时候,就已经确定了函数体内部自由变量的作用域。js没有块及作用域,除了全局作用域外,只有函数才能创建作用域。作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
除了全局变量外js运行只能在相对应的作用域起作用
作用域链:作用域有上下级关系,上下级关系的确定就看函数在哪个作用域下创建的,当代码在一个环境中执行,会创建变量对象的一个作用域链。当访问变量时,会一级一级向上寻找变量定义,直到找到他。若一直寻找到全局作用域还找不到就会报 ‘xxx is not defi