第四章(变量、作用域、内存问题)

基本类型的值在内存中固定大小的空间,引用类型的值是对象,保存在堆内存中

闭包的理解:http://www.cnblogs.com/dolphinX/archive/2012/09/29/2708763.html

JS中, this的值取决于调用的模式, 而JS中共有4中调用模式:

1. 方法调用模式
当一个函数被保存为对象的一个属性时, 我们称它为一个方法, 当一个方法被调用时, this指向该对象, 如:
var obj = {
value: 1,
getValue: function() {
alert(this.value);
}
};
obj.getValue(); // 输出1, 此时的this指向obj
注意: 该模式中, this到对象的绑定发生在方法被调用的时候.

2. 函数调用模式
当一个函数并非一个对象的属性时, 它被当作一个函数来调用, 此时的this指向全局对象(window), 如:
window.value = 1;
function getValue() { alert(this.value); }
getValue(); // 输出1, 此时的this指向window.

3. 构造器调用模式
结合new前缀调用的函数被称为构造器函数, 此时的this指向该构造器函数的实例对象, 如:
function show(val) {
this.value = val;
};
show.prototype.getVal = function() {
alert(this.value);
};
var func = new show(1);
func.getVal(); // 输出1
alert(func.value) // 输出1
// 从上面的结果, 可以看出, 此时的this指向了func对象.

4. apply/call调用模式
apply和call方法可以让我们设定调用者中的this指向谁, 如:
var fun = function(str) {
this.status = str;
}
fun.prototype.getStatus = function() {
alert(this.status);
}
var obj = {
status: "loading"
};
fun.prototype.getStatus.apply(obj); // 输出"loading", 此时getStatus方法中的this指向了obj
时间: 2024-11-19 04:27:40

第四章(变量、作用域、内存问题)的相关文章

第四章 变量 作用域和内存问题

4.1变量 变量包含2种类型的值: 基本类型的值: 即undefined,null, string,number,boolean.   按值访问,可以操作保存在变量中实际的值, 不能添加属性. var name = "Nicholas"; name.age = 27; console.log(name.age); //undefined 引用类型的值:多个值构成的对象.JS不允许直接操作对象的内存空间.给一个对象添加属性是,是在实际的对象中添加. 俩种类型值的区别: 1.保存方式不同:

读书笔记 - js高级程序设计 - 第四章 变量 作用域 和 内存问题

5种基本数据类型 可以直接对值操作 判断引用类型 var result = instanceof Array 执行环境 每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中 执行环境的销毁 某个执行环境中的所有代码执行完毕后 该环境被销毁 保存在其中的所有变量了函数定义也会随之销毁 作用域链中的对象 全局执行环境的变更对象始终都是作用域链中的最后一个对象 没有块级作用域 if 和 for 内的变量 外部也可以访问 标记清除 不同浏览器 只不过垃圾时间的长短不同 引

第四章 变量作用域和内存问题--笔记6

JavaScript没有块级作用域 使用var声明的变量会自动被添加到最近的环境中,如:在函数内部,最近的环境就是函数的局部环境,在with语句中,最近的环境就函数环境.如果初始化变量时没有使用var,则该变量自动被添加到全局环境. 在某个环境中读取或写入某个标识符时,就会在从作用域链的前端开始逐级向下查找,直至找到即停止搜索.

第四章 变量作用域和内存问题--笔记5(含问题)

作用域链得到延长的情况: try-catch语句的catch块:会创建一个新的变量对象,其中包含的是被抛出的错误对象声明. with语句:会将指定的对象添加到作用域链中. 问1:为什么url变成了buildUrl的变量,它不是在with中定义的吗? 答1:with语句关联了location对象,这意味着在with语句的代码块内部,每个变量首先被认为是一个局部变量,而如果在局部环境中找不到该变量的定义,就会查询location对象中是否有同名的属性,如果发现了同名属性,则以location对象属性

第四章 变量作用域和内存问题--笔记7

JavaScript的垃圾回收机制通常有两个策略: 标记清除(常用) 引用计数(不常用),在ie8-该策略会导致循环引用的问题. 优化内存的最佳方式:解除引用.这一做法适用于大多数全局变量和全局对象的属性.不过解除一个值的引用并不意味着自动回收该值所占用的内存,解除引用的真正作用是让值脱离执行环境,以便垃圾回收器下次运行时将其回收.

第四章 变量作用域和内存问题--笔记3

typeof可以准确检测到字符串.布尔.数值和undefined的值类型,但是如果变量值为null或者是一个对象的话,返回的就是object,检测函数时,该操作符会返回'function'. instanceof的使用方法:variable instanceof constructor ,若为该对象实例返回true,否则返回false. 注意:ECMA262规定任何在内如实现[[call]]方法的对象都应该在应用typeof操作符时返回function.由于Safari5-和chrome7-的正

第四章—变量,作用域和内存问题(二)

第四章-变量,作用域和内存问题(二) JS没有块级作用域 js没有块级作用域,这个概念容易导致误解,这里就区分下几个情况,大家好好参考下: 我们知道,在其他类C的语言中,由花挂号封闭的代码块都有自己的作用域.但是在JS中,却没有块级作用域: 这里if(true){}代表条件永真,永远执行这条.if(false){}的话就是永远不执行这条. 这个代码执行之后,在if语句定义的变量,在if语句外可以访问的到.在if语句中的变量声明会将变量添加到当前的执行环境中(这里是全局环境). 还有如下的两个例子

第四章 变量、作用域和内存问题

JavaScript变量松散类型的本质,决定了它只是在特定时间用于保存特定值的一个名字而已.由于不存在定义某个变量必须要保存何种数据类型值的规则,变量的值及其数据类型可以在脚本的生命周期内改变. 4.1基本类型和引用类型的值 ECMAScript变量可能包含两种不同数据类型的值:基本类型指的是简单的数据段,而引用类型指那些可能由多个值构成的对象. 5种基本数据类型(Undefined.Null.Boolean.Number.String)是按值访问的,因为可以操作保存在变量中的实际的值.基本类型

javascript高级程序设计第四章 变量、作用域和内存问题

变量包含两种,,基本类型和引用类型 基本类型是指一些简单的字段: 引用类型是?由多个值构成的对象  引用类型的值是保存在内存中的对象,在javascript中是不允许直接访问内存中的位置; 函数的参数是按照值类型进行传递的,函数的参数可以看作是一个局部变量. 检测类型: typeOf  用来检测基本类型的值用处大,在检测引用类型的值得时候用处不是很大  检测到的Null类型返回结果为Object, insctanceof 用来检测引用类型的值,当检测的对象是引用类型的值或者Object时返回tr

JavaScript高级程序设计(第三版)第四章 变量,作用域和内存问题

JavaScript变量可以用来保存两种类型的值:基本类型值和引用类型值.基本类型值和引用类型值具有以下特点: 基本类型值在内存中占据固定大小的空间,因此被保存在栈内存中: 从一个变量向另一个变量复制基本类型值,会创建这个值的一个副本: 引用类型的值是对象,保存在堆内存中: 包含引用类型值得变量实际上包含的并不是对象本身,而是一个指向该对象的指针: 从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象: 确定一个值是哪种基本类型可以使用typeof操作符,而