源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

JS作用域闭包、预解释和this关键字综合实例解析

  • 时间:2022-12-27 05:30 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:JS作用域闭包、预解释和this关键字综合实例解析
本文实例分析了JS作用域闭包、预解释和this关键字。分享给大家供大家参考,具体如下:
var number = 2;
var obj = {number : 5,
  fn1 : ( function() {
  this.number *= 2;
  number=number*2;
  var number=3;
    return function() {
      this.number *= 2;
      number*=3;
      alert(number);
    }
  } )()
};
var fn1 = obj.fn1;
alert(number);
fn1();
obj.fn1();
alert(window.number);
alert(obj.number);

【解析】 1. fn1本身后面就有(),所以var fn1 = obj.fn1;时他已经被执行,但是里面的return function并没有被执行 2. alert(number);输出全局的number,本来是2,经过var fn1 = obj.fn1;后,相当于执行了
this.number *= 2;
number=number*2;
var number=3;

这三句话 注意:任何一个直接执行的匿名方法,他的this指向window 所以this.number *= 2;使得全局变量变成4,即输出4 而number=number*2;他是去看作用域块里的number,var number=3;作用域声明在先,但是没有赋值,所以number=number*2;这句话其实没用 3. 执行到fn1();就是执行fn1里面的return function,也就是这三句话
this.number *= 2;
number*=3;
alert(number);

这时候依然是个匿名方法,所以this.number *= 2;使得全局变量变为8,number*=3;去找作用域块里的number,外层定义number为3,所以alert(number);就是9,如果是alert(this.number);则指向全局变量,即输出8 4. obj.fn1();,依然执行fn1里面的return function,也就是这三句话
this.number *= 2;
number*=3;
alert(number);

但这时this指向obj,this.number *= 2;使得obj里的number变为10,number*=3;还是去找作用域块,由于上面变为9,所以这里就是27,alert(number);输出的是作用域块的number,即27,如果是alert(this.number);则指向obj的number,即输出10 5. alert(window.number);经过上面几轮,全局变量变为8(即执行obj.fn1();对全局变量无影响) 6. alert(obj.number);只有这句话obj.fn1();,改变了obj.number,所以输出10
(function(){
   var a=10;
  fn();
  function fn(){
    var a=a+10;
    console.log(a);
     return a;
  }
  console.log(a);
  console.log(fn()+10);
})();

fn函数里的a先被声明但是没有赋值,然后进行运算,他不会去找函数外面的同名变量,因为他已经在里面被声明了。一个不是数字的和数字进行运算,输出NaN console.log(fn()+10);这句话要输出两个值:console.log(fn());和console.log(fn()+10); 结果: NaN 10 NaN NaN 如果题目改成
(function(){
  var a=10;
  fn();
  function fn(){
    a=a+10;
    console.log(a);
    return a;
  }
  console.log(a);
  console.log(fn()+10);
})();

结果: 20 20 30 40 更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《[url=http://www.1sucai.cn/Special/278.htm]JavaScript数组操作技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/148.htm]JavaScript排序算法总结[/url]》、《[url=http://www.1sucai.cn/Special/281.htm]JavaScript遍历算法与技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/119.htm]JavaScript数学运算用法总结[/url]》、《[url=http://www.1sucai.cn/Special/297.htm]JavaScript数据结构与算法技巧总结[/url]》、《[url=http://www.1sucai.cn/Special/472.htm]JavaScript查找算法技巧总结[/url]》及《[url=http://www.1sucai.cn/Special/439.htm]JavaScript错误与调试技巧总结[/url]》 希望本文所述对大家JavaScript程序设计有所帮助。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部