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