js变量作用域总结
2015-08-18 13:04
591 查看
1.this永远指向函数运行时所在的对象!而不是函数被创建时所在的对象,this对象是在运行时基于函数的执行环境绑定的,在全局环境中,this等于window
eg1:
<script>
var fullname = "Trigkit4";
var person = {
fullname : 'Jack',
prop:{
fullname : 'Blizzard',
getFullname : function () {
return this.fullname;
}
}
};
console.log(person.prop.getFullname());//Blizzard
var test = person.prop.getFullname;
console.log(test());//Trigkit4
</script>
this 的一般使用方法
1.1构造函数中使用
这时,
1.2 this全局环境中使用的例子:
对象中的this
2.值类型:数值、布尔值、null、undefined。
引用类型:对象、数组、函数。
注意点:
2.0变量的赋值方面
如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中
简而言之,堆内存存放引用值,栈内存存放固定类型值。“引用”是一个指向对象实际位置的指针。
2.1复制变量值方面
由以上可以得出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是地址
2.2传递参数方面
ECMAScript中,所有函数的参数都是按值传递的
2.3执行环境及作用域
去掉var的局部变量-》全局变量
2.4作用域
变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域,window对象的所有属性拥有全局作用域;在代码任何地方都可以访问,函数内部声明并且以var修饰的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用var但仍然是局部变量。
没有块级作用域if和for都是这样的
eg:
script type="text/javascript">
if(true){ //if语句的花括号没有作用域的功能。
var box = "trigkit4";
}
alert(box);//弹出 trigkit4
</script>
3.变量的查询
在变量的查询中,访问局部变量要比全局变量来得快,因此不需要向上搜索作用域链。
4.内存问题
javascript具有自动垃圾回收机制,一旦数据不再使用,可以将其设为"null"来释放引用
4.1 循环引用
一个很简单的例子:一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个DOM对象可能会引发内存泄露。这个DOM对象的引用将不会在脚本停止的时候被垃圾回收器回收。要想破坏循环引用,引用DOM元素的对象或DOM对象的引用需要被赋值为null。
4.2 闭包
在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。
4.3 DOM泄露
当原有的COM被移除时,子结点引用没有被移除则无法回收
4.4 Timers计(定)时器泄露
eg:for (var i = 0; i < 90000; i++) {
var buggyObject = {
callAgain: function() {
var ref = this;
var val = setTimeout(function() {
ref.callAgain();
}, 90000);
}
}
buggyObject.callAgain();
//虽然你想回收但是timer还在
buggyObject = null;
}
eg1:
<script>
var fullname = "Trigkit4";
var person = {
fullname : 'Jack',
prop:{
fullname : 'Blizzard',
getFullname : function () {
return this.fullname;
}
}
};
console.log(person.prop.getFullname());//Blizzard
var test = person.prop.getFullname;
console.log(test());//Trigkit4
</script>
this 的一般使用方法
1.1构造函数中使用
这时,
this就指这个新对象
<script type="text/javascript"> function test(){ this.x = 10; } var obj = new test(); alert(obj.x); //弹出 10; </script>
1.2 this全局环境中使用的例子:
<script type="text/javascript"> var name = "全局"; function getName(){ var name = "局部"; return this.name; }; alert(getName());//弹出 全局; </script>
<script type="text/javascript"> var foo = { test:function(){ alert(this); } } foo.test();//object,因为test方法在调用时属于foo对象 var baz = foo.test; baz();//window,因为baz()被调用时属于global对象 </script>
局部环境中的使用
<script type="text/javascript"> var name = "全局"; var jubu={ name:"局部", getName:function(){ return this.name; } }; alert(jubu.getName()); </script>
作用域链中的this
<script type="text/javascript"> function scoping () { console.log(this); return function () { console.log(this); }; } scoping()(); >>window >> window </script>因为
scoping函数属于window对象,自然作用域链中的函数也属于
window对象
对象中的this
var obj = { foo: "test", bar: function () { console.log(this.foo); } }; obj.bar(); // "test"
2.值类型:数值、布尔值、null、undefined。
引用类型:对象、数组、函数。
注意点:
2.0变量的赋值方面
如果赋值的是引用类型的值,则必须在堆内存中为这个值分配空间。由于这种值的大小不固定(对象有很多属性和方法),因此不能把他们保存到栈内存中。但内存地址大小是固定的,因此可以将内存地址保存在栈内存中
简而言之,堆内存存放引用值,栈内存存放固定类型值。“引用”是一个指向对象实际位置的指针。
2.1复制变量值方面
由以上可以得出:在变量复制方面,基本类型和引用类型也有所不同,基本类型复制的是值本身,而引用类型复制的是地址
2.2传递参数方面
ECMAScript中,所有函数的参数都是按值传递的
2.3执行环境及作用域
去掉var的局部变量-》全局变量
2.4作用域
变量没有在函数内声明或者声明的时候没有带var就是全局变量,拥有全局作用域,window对象的所有属性拥有全局作用域;在代码任何地方都可以访问,函数内部声明并且以var修饰的变量就是局部变量,只能在函数体内使用,函数的参数虽然没有使用var但仍然是局部变量。
没有块级作用域if和for都是这样的
eg:
script type="text/javascript">
if(true){ //if语句的花括号没有作用域的功能。
var box = "trigkit4";
}
alert(box);//弹出 trigkit4
</script>
3.变量的查询
在变量的查询中,访问局部变量要比全局变量来得快,因此不需要向上搜索作用域链。
4.内存问题
javascript具有自动垃圾回收机制,一旦数据不再使用,可以将其设为"null"来释放引用
4.1 循环引用
一个很简单的例子:一个DOM对象被一个Javascript对象引用,与此同时又引用同一个或其它的Javascript对象,这个DOM对象可能会引发内存泄露。这个DOM对象的引用将不会在脚本停止的时候被垃圾回收器回收。要想破坏循环引用,引用DOM元素的对象或DOM对象的引用需要被赋值为null。
4.2 闭包
在闭包中引入闭包外部的变量时,当闭包结束时此对象无法被垃圾回收(GC)。
4.3 DOM泄露
当原有的COM被移除时,子结点引用没有被移除则无法回收
4.4 Timers计(定)时器泄露
eg:for (var i = 0; i < 90000; i++) {
var buggyObject = {
callAgain: function() {
var ref = this;
var val = setTimeout(function() {
ref.callAgain();
}, 90000);
}
}
buggyObject.callAgain();
//虽然你想回收但是timer还在
buggyObject = null;
}
相关文章推荐
- C#实现将类的内容写成JSON格式字符串的方法
- 解决json日期格式问题的3种方法
- js中的闭包之我理解
- 固定滚动JS源码
- jsp的select控件,怎么用EL表达式自动选中
- JS判断输入的字符串是否是数字(正则表达式)
- js 判断本地文件
- 《Javascript权威指南》十六学习笔记:BOM资源---BOM基本应用
- js验证码
- js中==和===的区别
- js 开启video全屏模式
- 手风琴JS特效源码
- js实现动态删除表格行和列
- json和XML
- js实现表格的动态添加
- Errors running builder 'JavaScript Validator' on project
- js实现表格行的动态添加
- JS获取屏幕宽高及分辨率
- 关于 js文件中使用el表达式问题
- JavaScript中的变量及数据类型