• 函数表达式和函数声明


    学习文章----汤姆大叔的博客

    总结笔记

    函数声明:

    1.函数声明必须要有名称

    2.位置只能在全局上下文和函数体内,不能出现在代码块(if)中

    函数表达式:

    特点:不会影响上下文的全局对象VO

    var foo = {};
     
    (function initialize() {
     
      var x = 10;
     
      foo.bar = function () {
        alert(x);
      };
     
    })();
     
    foo.bar(); // 10;
     
    alert(x); // "x" 未定义
    

      

    1.表达式可以没有名称,表达式不能以function开头

    2.当表达式不在规定位置时,需要用分组操作符圆括号强制转化为表达式。如果解析器知道它是一个表达式,就没必要用圆括号。

    var foo = {
     
      bar: function (x) {
        return x % 2 != 0 ? 'yes' : 'no';
      }(1)   //这里已经知道是表达式,就没有必要用圆括号
     
    };
     
    

      

    函数表达式在IE的JScript中的bug

    1.函数表达式在变量对象中可见

    2.①var foo = function bar(){};  //创建了两个对象foo和bar,

       foo === bar; //false,但两个对象的输出结果是一样的

      修改foo的属性值,不会影响bar对象 

    var foo = function bar() {
      alert('foo');
    };
     
    alert(typeof bar); // "function", 
     
    // 有趣的是
    alert(foo === bar); // false!
     
    foo.x = 10;
    alert(bar.x); // 未定义
     
    // 但执行的时候结果一样
     
    foo(); // "foo"
    bar(); // "foo"
    

    ②但是,如果将函数表达式bar单独描述,再赋值给foo,就符合我们的逻辑了

    (function bar() {});
     
    var foo = bar;//将bar的引用赋值给foo
     
    alert(foo === bar); // true
     
    foo.x = 10;
    alert(bar.x); // 10
    

      

    易错点:

    ①作用域链在函数定义的时候就已经确定了。[[scope]]在函数创建的时候就已经确定。

       特例:通过函数构造函数创建的函数的[[scope]]始终为全局对象。var foo = new Function('alert(x);alert(y)');

    ②this在函数被调用的时候才确定。

  • 相关阅读:
    Java类的静态块の二
    Java类的静态块の一
    Eclipse优化工具Optimizer for Eclipse
    C#实现MD5WITHRSA签名
    Ubuntu 初始化Root账户密码
    shell连接本机虚拟机
    Nodejs的Express完成安装指导
    node.js之Windows 系统下设置Nodejs NPM全局路径
    Unicode, UTF-8, GBK, ASCII的区别
    BootstrapValidation一些tips
  • 原文地址:https://www.cnblogs.com/xuhaodong/p/xu1109.html
Copyright © 2020-2023  润新知