JavaScript学习笔记(四)——函数表达式

匿名函数

var functionName = function(arg0, arg1,arg2){
  //do sth
};

作用:模仿块级作用域

//用作会计作用域(私有作用域)的匿名函数的语法
(function(){
  //这里是块级作用域
})(); //函数声明加上括号即可

function output(count){
  (function(){
    for(var i = 0; i < count; i++ ){
      console.log(i);
    }
  })();

  console.log(i); // 出错
}

递归

function factorial(num){
  if (num <= 1 ){
    return 1;
  } else {
    return num * arguments.callee(num - 1); //使用arguments.callee而不是函数名的原因是函数名可能会发生变化
  }
}

严格模式下使用命名函数

var factorial = (function f(num){
  if (num <= 1){
    return 1;
  } else {
    return num * f(num - 1);
  }
});

闭包

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包常见的方式,就是在一个函数内部创建另一个函数。

当在函数内部定义了其他函数是,就创建了闭包。闭包有权访问包含函数内部的所有变量,原理如下:

  • 在后台执行环境中,闭包的作用域链包含着它自己的作用域、包含函数的作用域和全局作用域。
  • 通常,函数的作用域及其所有变量都会在函数执行结束后被销毁。
  • 当函数返回了一个闭包是,这个函数的作用域将会一只在内存中保存到闭包不存在为止。
function createFunctions(){
  var result = new Array();
  for (var i = 0; i < 10; i++ ){
    result[i] = function(){
      return i;
    };
  }
  return result;
}

var result = createFunctions();
result.forEach(function(item, index, array){
  console.log(item());//10个10
});

每个函数都返回10,因为每个函数的作用域链中都保存着createFunctions()函数的活动对戏那个,所以它们引用的是同一个变量i。当createFunction()函数返回后,变量i的值都是10。

通过定义匿名函数,并将立即执行该匿名函数的结果赋给数组可以解决这个问题:

function createFunctions(){
  var result = new Array();
  for (var i = 0; i < 10; i++ ){
    result[i] = function(num){
      return function(){
        return num;
      };
    }(i);
  }
  return result;
}

var result = createFunctions();
result.forEach(function(item, index, array){
  console.log(item());//0~9
});

作用:用于创建访问私有变量的公有方法。

特权方法:有权访问私有变量和私有函数的公有方法

//增强的模块模式
var f = function(){
  //私有变量和私有函数
  var privateVar = 10;

  function privateFunction(){
    return false;
  }

  //创建对象
  var object = new CustomType();

  //添加特权/公有属性和方法
  object.publicProperty = true;

  object.publicMethod = function(){
    privateVar++;
    return privateFunction();
  };

  return object;

}();

this

几种特殊情况下,this的值可能会意外改变。

var name = "The Window";

var object = {
  name : "Object",

  getName : function(){
    return this.name;
  }
};

object.getName(); // 'Object"
(object.getName)(); // "Object"
(object.getName = object.getName)(); //"The Window"

你可能感兴趣的:(JavaScript学习笔记(四)——函数表达式)