call,apply方法的使用
- 绑定一些函数,用于传递参数的调用
function sum(x,y){
return x + y;
}
function call1(num1,num2){
return sum.call(this, num1 , num2);
//this指当前这个函数的作用域,传递当前函数的参数num1与num2
}
//apply方法与call方法类似,不过apply方法传递的是一个数组
function apply1(num1,num2){
return sum.apply(this,[num1,num2]);//这里是个数组
}
- 扩充作用域
window.color = 'red';
var obj = {color:'blue'};//对象与方法没有耦合关系
function showColor(){
alert(this.color);
}
showColor.call(window);
showColor.call(obj);
执行环境与作用域链
- 执行环境是js中最重要的一个概念。执行环境定义了变量或有权访问的其他数据,决定了它们各自的行为。每个执行环境都有一个与之关联的变量对象,环境中定义的所有变量和函数都保存在这个对象中。
作用域链是你可以一级一级的访问上一级的作用域的变量和函数,但是你不能从上一层向下来进行访问下一级的作用域的变量
一层一层的向上来追溯,有顺序的向上去找,全局变量尽量少用
垃圾收集,块级作用域
垃圾收集
- 标记法
//垃圾收集 标记法
function test(){
var a = 10; //被标记
var b = 20; //被使用
}
test();
//执行完毕之后,a与b两个变量又会被标记一次,
//状态为没有被使用,则释放ab变量的内存空间
- 引用计数法(不做介绍)
块级作用域
- js没有块级作用域的概念
function test(){
for (var i = 1; i<=5;i++){
alert(i);
}
alert(i); //这个alert还可以执行,并且为6
}
test();
闭包
//闭包:一个函数 可以访问另外一个 函数作用域中的变量
//封闭性:起到保护变量的作用
//1级作用域
function f(x){ //2作用域
var temp = x;
return function(x){ //3作用域
temp += x;
alert(temp);
}
}
//如果下级还有函数使用上个变量,就不会进行垃圾回收。
var a = f(50)
a(5);