---做用域&闭包篇

做用域&闭包篇

什么是闭包

“闭包是指有权访问另外一个函数做用域中的变量的函数”--《JavaScript高级程序设计》javascript

具体一点

function foo(){
    var a = "test";
    function bar(){
        return a;
    }
    return bar();
}
//如今回头再看看闭包的定义:)
var b = foo();
bar();  //a
复制代码

小练习

/* * 题目: * 完善工厂函数 createPerson,须要完成如下要求: * 1.保存传入参数 name 到一个私有变量中 * 2.函数返回一个对象,且对象带有一个方法 getName,用于返回对象的私有变量 name 的值 */

function createPerson(name) {
    var n = name;
    var result = {
        getName : function(){
            return n;
        }
    }
    return result;
}

var person = createPerson('web');
console.log(person.name); //你什么都得不到的,相信我
console.log(person.getName());
复制代码

再进一步,看一下Js中的做用域

this是什么

this其实指的就是函数的执行环境,看下面一段代码java

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

sayName();  //web,执行环境windows
o.sayName = sayName;
o.sayName(); //test,执行环境o
复制代码

一些特性

1.this并非声明函数时就已经肯定的,调用时才会肯定this的取值
2.全局环境下执行函数this通常指向window,对象的方法通常指向对象
复制代码

练习

函数的方法--改变this指向

bind

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

o.sayName = sayName.bind(window);
o.sayName(); //web,执行环境window
复制代码

call和apply

window.name = "web";
var o = {
  name :  "test"
};
function sayName(){
    console.log(this.name);
}

sayName.call(o);  //test,执行环境o
sayName.apply(o);   //test,执行环境o
复制代码

call与apply的区别

sayName.call(o,1,2,3);  //正常传参
sayName.apply(o,[1,2,3]);   //只接受两个参数,第一个参数执行环境,第二个是参数的数组
复制代码

练习

相关文章
相关标签/搜索