JS学习笔记-5 作用域 闭包

155 阅读1分钟

作用域:

先举个例子

var a = 1;
console.log(a);//1
--------------------
function fun(){
    var b = 2
}
console.log(b)//报错

概念: 作用于是运行时代码中的某些特定部分中变量,函数和对象的可访问性

全局作用域和函数作用域

最外层函数和最外层函数外面定义的变量拥有全局作用域

function outFun() { //最外层函数
    var inVariable = "内层变量";
    function innerFun() { //内层函数
        console.log(inVariable);
    }
    innerFun();
}
console.log(outVariable); //我是最外层变量
outFun(); //内层变量
console.log(inVariable); //inVariable is not defined
innerFun(); //innerFun is not defined

所有未定义直接复制的变量自动声明为拥有全局作用域

function outFun2() {
    variable = "未定义直接赋值的变量";
    var inVariable2 = "内层变量2";
}

所有window对象的属性拥有全局作用域

弊端:如果变量都拥有全局作用域,会污染全局命名空间,容易引起冲突。
办法:在代码最外层写 (function(){}...)

块级作用域

闭包:

function user(name){
    var age,sex;
    return{
        getName:function(){
            return name;
        },
        setName:function(newName){
        name = newName
        },
        getAge:function () {
            return age;
        },
        setAge:function (newAge) {
            age = newAge
        },
        getSex:function () {
            return sex;
        },
        setSex:function (newSex) {
            sex = newSex;
        }
}
}
var whh = new user();
whh.setName("王花花");
whh.setAge("22");
whh.setSex("女");
var name = whh.getName();
var age = whh.getAge();
var sex = whh.getSex();
console.log(name,sex,age);