函数

函数

网道JavaScript教程学习笔记

点此进入网道JavaScript教程

函数的声明
function print(s) {
  console.log(s);
}
  1. 除了用function命令声明函数,还可以采用变量赋值的写法。

    var print = function(s) {
      console.log(s);
    };
    

    采用函数表达式声明函数时,function命令后面不带有函数名。如果加上函数名,该函数名只在函数体内部有效,在函数体外部无效。

    var print = function x(){
      console.log(typeof x);
    };
    
    x
    // ReferenceError: x is not defined
    
  2. 函数的重复声明: 如果同一个函数被多次声明,后面的声明就会覆盖前面的声明。

第一等公民

JavaScript 语言将函数看作一种值,与其它值(数值、字符串、布尔值等等)地位相同。凡是可以使用值的地方,就能使用函数。**由此,函数名和变量名提升规则相同, 整个函数会像变量声明一样,被提升到代码头部 **

函数的属性和方法

name属性

函数的name属性返回函数的名字。

function f() {}
f.name // "f"

如果是通过变量赋值定义的函数,那么name属性返回变量名。

var f2 = function () {};
f2.name // "f2"

如果变量的值是一个具名函数,那么name属性返回function关键字之后的那个函数名。

var f3 = function x() {};
f3.name // 'x'
length属性

函数的length属性返回函数预期传入的参数个数,即函数定义之中的参数个数。

function x(a, b, c) {}
x.length // 3
toString()

函数的toString方法返回一个字符串,内容是函数的源码。

function x () {
    /*haha
	*/
	console.log("1223");
}

x.toString()
// 结果:

"function x () {
    /*haha
	*/
	console.log("1223");
}"

对于那些原生的函数,toString()方法返回function (){[native code]}

函数作用域
  1. 作用域(scope)指的是变量存在的范围。ES6的JavaScript 有三种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;一种是函数作用域,变量只在函数内部存在。块级作用域 ,变量只在一个块(一个大括号内)存在。

  2. 函数内部定义的变量,会在该作用域内覆盖同名全局变量。

var v = 1;

function f(){
  var v = 2;
  console.log(v);
}

f() // 2
v // 1
函数内部存在变量提升
函数本身作用域

函数执行时所在的作用域,是定义时的作用域,而不是调用时所在的作用域。

函数的参数
  1. 函数参数不是必需的,JavaScript 允许省略参数。

  2. 没有办法只省略靠前的参数,而保留靠后的参数。如果一定要省略靠前的参数,只有显式传入undefined

    function f(a, b) {
      return a;
    }
    
    f( , 1) // SyntaxError: Unexpected token ,(…)
    f(undefined, 1) // undefined
    
  3. 参数传递方式

  4. 函数参数如果是原始类型的值(数值、字符串、布尔值),传递方式是传值传递

  5. 如果函数参数是复合类型的值(数组、对象、其他函数),传递方式是传址传递

arguments 对象
  1. 由于 JavaScript 允许函数有不定数目的参数,所以需要一种机制,可以在函数体内部读取所有参数。这就是arguments对象的由来。

  2. 虽然arguments很像数组,但它是一个对象。数组专有的方法(比如sliceforEach),不能在arguments对象上直接使用。

    如果要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组。

    var args = [];
    for (var i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    
闭包
  1. JavaScript语言特有的"链式作用域"结构(chain scope),子对象会一级一级地向上寻找所有父对象的变量。所以,父对象的所有变量,对子对象都是可见的,反之则不成立。

  2. 介于此种原因,如果使用函数返回一个子函数,那么就可以在子函数访问父函数的变量了。

    function f1() {
      var n = 999;
      function f2() {
        console.log(n);
      }
      return f2;
    }
    
    var result = f1();
    result(); // 999
    
  3. 闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。

  4. 外层函数每次运行,都会生成一个新的闭包,而这个闭包又会保留外层函数的内部变量,所以内存消耗很大。因此不能滥用闭包,否则会造成网页的性能问题。

eval命令
  1. eval命令接受一个字符串作为参数,并将这个字符串当作语句执行
  2. 如果eval的参数不是字符串,那么会原样返回。
  3. eval的本质是在当前作用域之中,注入代码。由于安全风险和不利于 JavaScript 引擎优化执行速度,所以一般不推荐使用。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值