函数
- 函数的name属性返回函数的名字;
- 利用
toString
,可以变相实现多行字符串:
var multiline = function (fn) {
var arr = fn.toString().split(‘
’);
return arr.slice(1, arr.length - 1).join(‘
’);
};
function f() {/*
这是一个
多行注释
*/}
multiline(f);
// “ 这是一个
// 多行注释”
- 注意,对于var命令来说,局部变量只能在函数内部声明,在其他区块中声明,一律都是全局变量;
- 函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域:
var a = 1;
var x = function () {
console.log(a);
};
function f() {
var a = 2;
x();
}
f() // 1
//很容易犯错的一点是,如果函数A调用函数B,却没考虑到函数B不会引用函数A的内部变量。
var B = function () {
console.log(a);
};
function A(f) {
var a = 2;
f();
}
A(B)
// ReferenceError: a is not defined
- 运行时无论提供多少个参数(或者不提供参数),JavaScript 都不会报错。省略的参数的值就变为undefined;
- 函数的length属性与实际传入的参数个数无关,只反映函数预期传入的参数个数;
- return不能单独使用,必须在函数中使用;
- eval最常见的场合是解析 JSON 数据的字符串,不过正确的做法应该是使用原生的JSON.parse方法;
严格模式与eval
配合
- 外部作用域的代码无法取得
eval
内定义的变量:
(function f() {
‘use strict’;
eval(‘var foo = 123’);
console.log(foo); // ReferenceError: foo is not defined
})()
- 但是
eval
可以读写外部作用域的变量的值:
(function f() {
‘use strict’;
var foo = 1;
eval(‘foo = 2’);
console.log(foo); // 2
})()
- 为了保证
eval
的别名不影响代码优化,JavaScript 的标准规定,凡是使用别名执行eval
,eval
内部一律是全局作用域:
//下面这些形式都是eval的别名调用,作用域都是全局作用域。
eval.call(null, ‘…’)
window.eval(‘…’)
(1, eval)(‘…’)
(eval, eval)(‘…’)