JavaScript作用域

来源:互联网 发布:软件使用费增值税税率 编辑:程序博客网 时间:2024/06/08 12:54

一、作用域和作用域链
对于JavaScript初学者来说,我们创建一个方法、变量或者方法,他们都有一个生存的环境,好比人的生存环境就是地球(空气)一样,离开了这个生存环境就会挂掉。对于变量来说,他们的作用域就是这个生存环境。
1.对于直接定义的函数和对象的方法,作用域默认状态下是它的定义处的作用域链。

           var name = 'window下的name<br/>';            var resultCon;            function fn1() {                resultCon.innerHTML += name;            }            function MyObj() {                var name = 'MyObj下的name<br/>';                this.doFunction = function() {                    resultCon.innerHTML += name;                };            }            window.onload = function() {                resultCon = document.getElementById('result');                var name = "onload下的name<br/>";                var fn2 = function() {                    resultCon.innerHTML += name;                };                fn1(); //window下的name                fn2(); //onload下的name                var obj = new MyObj();                obj.doFunction(); //MyObj下的name            };

输出结果:代码输出结果:
window下的name
onload下的name
MyObj下的name
(1).来看看这个输出啥结果

var v = "hello";(function(){  console.log(v);  var v = "world";})();

结果是:undefined
javascript的变量声明具有hoisting机制,JavaScript引擎在执行的时候,会把所有变量的声明都提升到当前作用域的最前面。
声明宣称一个名字的存在,定义则为这个名字分配存储空间,而初始化则是为名字分配的存储空间赋初值。
所以他其实相当于

var v;//声明变量vv = "hello";//(定义并)初始化变量v
var v = "hello";(function(){  var v; //declaration hoisting  console.log(v);  v = "world";})();

(2).再看一个

var v = "hello";if(true){  console.log(v);  var v = "world";}

输出结果是:hello
javascript是没有块级作用域的。函数是JavaScript中唯一拥有自身作用域的结构。
(3).再来一个

(function(){  //var f1,function f2(){}; //hoisting,被隐式提升的声明  f1(); //ReferenceError: f1 is not defined  f2();  var f1 = function(){};  function f2(){}})();

结果是:上面代码中函数声明f2被提升,所以在前面调用f2是没问题的。虽然变量f1也被提升,但f1提升后的值为undefined,其真正的初始值是在执行到函数表达式处被赋予的。所以只有声明是被提升的。

原创粉丝点击