Java基础学习心得03
函数
- 函数的name属性返回函数的名字;
- 利用
toString
,可以变相实现多行字符串:
“`
var multiline = function (fn) {
var arr = fn.toString().split(‘\n’);
return arr.slice(1, arr.length – 1).join(‘\n’);
};
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`配合
1. 外部作用域的代码无法取得`eval`内定义的变量:
(function f() {
‘use strict’;
eval(‘var foo = 123’);
console.log(foo); // ReferenceError: foo is not defined
})()
2. 但是`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)(‘…’)
“`