Fork me on GitThub

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
})()
  1. 但是eval可以读写外部作用域的变量的值:
(function f() {
  ‘use strict’;
  var foo = 1;
  eval(‘foo = 2’);
  console.log(foo);  // 2
})()

  • 为了保证eval的别名不影响代码优化,JavaScript 的标准规定,凡是使用别名执行evaleval内部一律是全局作用域:
//下面这些形式都是eval的别名调用,作用域都是全局作用域。
eval.call(null, ‘…’)
window.eval(‘…’)
(1, eval)(‘…’)
(eval, eval)(‘…’)
posted @ 2018-06-17 15:29  林檎endymion  阅读(119)  评论(0编辑  收藏  举报