美文网首页
JS之函数

JS之函数

作者: 不明suoyi | 来源:发表于2019-07-28 20:56 被阅读0次

函数

指可以执行代码的对象,和数组一样有不一致性。

三种函数声明方式
  • function f() { }
  • var f = function f() { }; //注意分号
  • f = new Function ('x','y','return x+y') //只有最后一个参数会被当作函数体,可以不使用new 命令,不推荐使用这种声明方式
    注意:如果同一个函数被多次声明,后面的声明会覆盖前面的声明。也就是说起前面的声明会失效。
    函数名的提升
    JS引擎将函数名视同变量名,使用function 声明函数时,整个函数回想变量声明一样被提升到代码头部。如果同时使用function命令和赋值语句声明同一个函数,左后总是采用赋值语句的定义
var f = function () {
  console.log('1');
}
function f() {
  console.log('2');
}
f() // 1

函数的属性和方法

  • name :f.name返回函数的名字,如果通过变量赋值定义的匿名函数则返回变量名。具名函数返回function关键字后的函数名。
var f3 = function myName() {};
f3.name // 'myName'

上面代码中,f3.name返回函数表达式的名字。注意,真正的函数名还是f3,而myName这个名字只在函数体内部可用。
用处:可用来获取参数函数的名字。

  • length: f.length 返回函数预期传入的参数个数。
  • toString: 返回一个字符串,内容是函数源码。
    作用域
    作用域(scope)指的是变量存在的范围。在 ES5 的规范中,JavaScript 只有两种作用域:一种是全局作用域,变量在整个程序中一直存在,所有地方都可以读取;另一种是函数作用域,变量只在函数内部存在。ES6 又新增了块级作用域。
    对于顶层函数来说,函数外部声明的变量就是全局变量(global variable),它可以在函数内部读取。
    在函数内部定义的变量,外部无法读取,称为“局部变量”(local variable)。
    函数内部定义的变量,会在该作用域内覆盖同名全局变量。函数内部的变量也会提升。
    参数
  • 参数可以省略,但没办法指省略靠前的参数而保留后面的参数,若必须省略靠前的参数,只能显示传入 undefined
  • 传递方式:函数参数如果是原始类型的值,传递方式是传值传递,这意味着在函数体内部修改参数值不会影响到函数外部。如果函数参数是复合类型的值,传递方式是传址传递,也就是说,传入函数的原始值的地址,因此在函数内部修改参数将会影响到原始值。
var obj = { p: 1 };
function f(o) {
  o.p = 2;
}
f(obj);
obj.p // 2

上面代码中,传入函数f的是参数对象obj的地址。因此,在函数内部修改obj的属性p,会影响到原始值。

注意,如果函数内部修改的,不是参数对象的某个属性,而是替换掉整个参数,这时不会影响到原始值。如果有同名函数,则取最后出现出现的值。

function f(a, a) {
  console.log(a);
}

f(1) // undefined
function f(a, a) {
 console.log(arguments[0]);
}
f(1) // 1

arguments对象

  • arguments对象包含了函数运行时的所有参数。arguments[0]就是第一个参数,arguments[1]就是第二个参数,以此类推。这个对象只有在函数体内部,才可以使用。
    正常模式下,arguments对象可以在运行时修改。
var f = function(a, b) {
  arguments[0] = 3;
  arguments[1] = 2;
  return a + b;
}

f(1, 1) // 5

严格模式下,arguments对象与函数参数不具有联动关系。也就是说,修改arguments对象不会影响到实际的函数参数。

var f = function(a, b) {
  'use strict'; // 开启严格模式
  arguments[0] = 3;
  arguments[1] = 2;
  return a + b;
}

f(1, 1) // 2

上面代码中,函数体内是严格模式,这时修改arguments对象,不会影响到真实参数a和b。

  • 需要注意的是,虽然arguments很像数组,但它是一个对象。数组专有的方法(比如slice和forEach),不能在arguments对象上直接使用。
    如果要让arguments对象使用数组方法,真正的解决方法是将arguments转为真正的数组。
    下面是两种常用的转换方法:slice方法和逐一填入新数组。
var args = Array.prototype.slice.call(arguments);

// 或者
var args = [];
for (var i = 0; i < arguments.length; i++) {
  args.push(arguments[i]);
}

闭包
一个函数如果使用了它范围外的变量,那么这个函数+这个变量就是一个闭包。

function f1() {
  var n = 999;
  function f2() {
    console.log(n);
  }
  return f2;
}

var result = f1();
result(); // 999

上面代码中,函数f1的返回值就是函数f2,由于f2可以读取f1的内部变量,所以就可以在外部获得f1的内部变量了。

闭包就是函数f2,即能够读取其他函数内部变量的函数。由于在 JavaScript 语言中,只有函数内部的子函数才能读取内部变量,因此可以把闭包简单理解成“定义在一个函数内部的函数”。闭包最大的特点,就是它可以“记住”诞生的环境,比如f2记住了它诞生的环境f1,所以从f2可以得到f1的内部变量。在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。

闭包的最大用处有两个,一个是可以读取函数内部的变量,另一个就是让这些变量始终保持在内存中,即闭包可以使得它诞生环境一直存在。请看下面的例子,闭包使得内部变量记住上一次调用时的运算结果。
本文内容摘自(https://wangdoc.com/javascript/types/function.html

相关文章

  • JS之函数

    函数 每个函数都是 Function 类型的实例,而且都与其他引用类型一样具有属性和方法。函数没有重载,函数可以有...

  • JS之函数

    问答题 1. 函数声明和函数表达式有什么区别 1.函数声明必须有标识符,也就是常说的函数名;函数表达式可以省略函数...

  • js之is()函数

    is方法用于查看选择的元素是否匹配选择器语法:$(selector).is(selectorElement,fun...

  • js之函数

    1.函数声明和函数表达式有什么区别? 函数声明: 使用function关键字声明一个函数函数表达式: 声明一个变量...

  • JS之函数

    函数 指可以执行代码的对象,和数组一样有不一致性。 三种函数声明方式 function f() { } var ...

  • JavaScript 05 函数

    js函数的概念和作用,js函数的定义,js函数的调用,js事件驱动的概念,js函数的实参和形参,js的作用域,js...

  • js 深入

    * js语法* js的动态函数和匿名函数* js动态函数Functionnew Function();* 匿名函数...

  • JS之Function类型理解

    JS之Function类型理解 简述 函数实际上也是对象,每个函数都是Function对象的实例,因此,函数名是一...

  • 2018-12-01

    js中括号操作属性 js函数 js换肤 变量和函数预解析 匿名函数 函数传参 函数return关键字 流程控制语句...

  • JS面试之对象(2)

    序列文章 JS面试之函数(1)JS面试之数组的几个不low操作(3) 前言 一篇彻底搞懂对象,从此不用担心没对象啦...

网友评论

      本文标题:JS之函数

      本文链接:https://www.haomeiwen.com/subject/kwmurctx.html