028. js 严格模式 'use strict' & _variable & IIFE (Immediately Invoked Function Expression) - cwy007/tips-and-skills GitHub Wiki

1. 严格模式

严格模式下,arguments对象是一个只读对象,修改它是无效的,但不会报错。

var f = function(a, b) {
  'use strict';
  arguments[0] = 3; // 无效
  arguments[1] = 2; // 无效
  return a + b;
}

f(1, 1) // 2

2. 内部变量 _age

function Person(name) {
  var _age;
  function setAge(n) {
    _age = n;
  }
  function getAge() {
    return _age;
  }

  return {
    name: name,
    getAge: getAge,
    setAge: setAge
  };
}

var p1 = Person('张三');
p1.setAge(25);
p1.getAge() // 25

上面代码中,函数Person的内部变量_age,通过闭包getAge和setAge,变成了返回对象p1的私有变量。

3.函数定义后立即调用

“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称IIFE

1.rails 中的应用

# app/assets/javascripts/cable.js
(function() {
  this.App || (this.App = {});

  App.cable = ActionCable.createConsumer();

}).call(this);

2. js解释说明

有时,我们需要在定义函数之后,立即调用该函数。这时,你不能在函数的定义之后加上圆括号,这会产生语法错误。

function(){ /* code */ }();
// SyntaxError: Unexpected token (

产生这个错误的原因是,function这个关键字即可以当作语句,也可以当作表达式。

// 语句
function f() {}

// 表达式
var f = function f() {}

为了避免解析上的歧义,JavaScript引擎规定,如果function关键字出现在行首,一律解释成语句。因此,JavaScript引擎看到行首是function关键字之后,认为这一段都是函数的定义,不应该以圆括号结尾,所以就报错了。

解决方法就是不要让function出现在行首,让引擎将其理解成一个表达式。最简单的处理,就是将其放在一个圆括号里面。

(function(){ /* code */ }());
// 或者
(function(){ /* code */ })();

上面两种写法都是以圆括号开头,引擎就会认为后面跟的是一个表示式,而不是函数定义语句,所以就避免了错误。这就叫做“立即调用的函数表达式”(Immediately-Invoked Function Expression),简称IIFE。

link: http://javascript.ruanyifeng.com/grammar/function.html

4. 圆括号的作用

函数放在圆括号中,会返回函数本身。如果圆括号紧跟在函数的后面,就表示调用函数。

function f() {
  return 1;
}

(f) // function f(){return 1;}
f() // 1

上面代码中,函数放在圆括号之中会返回函数本身,圆括号跟在函数后面则是调用函数。

link: http://javascript.ruanyifeng.com/grammar/operator.html