JS-函数(阮一峰js函数要点总结)

1、概述

1.1函数申明:

函数命令(函数的声明):function a(){}

函数表达式:const a=function(){}

1.2函数的重复声明:

后者覆盖前者(涉及到函数名的提升)

1.3 return和递归

1.4第一公民

函数可以作为变量和对象属性的赋值以及传参

1.5函数名的提升

(1)在js引擎中,函数命令本身会被整个提到头部去,如下

f()

function f(){}

js执行顺序:

function f(){}

f()

(2)被赋值的函数表达式如下

f()

var f=function (){}

js执行顺序:

var f

f() //这时候的f是指被定义了,但没有被赋值,更不知道他是不是函数

f=function(){}

最后结果:undefined is not a function

!!!最后值得注意的是:

function f(){}

var f=function (){}

f()

无论顺序是否是函数命令在上还是函数表达式在上,f()只会去调赋值的函数表达式

1.6不能在条件语句中声明函数

总结建议:如果要在try/if中使用函数,建议用函数表达式。


2、函数的属性和方法

2.1 属性:name(function后的名字)

函数定义的三种形式:

(1)

function f(){}

f.name //f

(2)

var f1=function(){}

f1.name // ' '

(3)

var f2=function myname(){}

f2.name // myname

第三种 :真正的函数名还是f2,myname只在函数体内部使用

2.2 属性:length

 长度是函数定义时,参数的个数

2.3方法:toString()

返回函数的源码


3、函数的作用域

3.1全局作用域与函数作用域

3.2函数内部的变量提升

其实在函数内部也存在变量提升,在函数体内,var 命令申明的变量,都会提升到函数体的头部。

3.3函数本身的作用域

注意点:作用域和变量一样,是在其申明时所在的作用域。

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

var a=1//a是全局变量

var x=function(){

console.log(a)

}// x是全局函数,其可使用的变量范围在全局中,例如a

function f(){

var a=2

x()//相当于指向外面的那个函数,让外面那个函数去跑一下

}

f()// 1

4、参数

4.1 概述

函数运行的时候,有时需要提供外部数据,不同的外部数据会得到不同的结果,这种外部数据就叫参数。

4.2 参数的缺省

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

4.3默认值

注意点:避免在传值的时候,传空字符 ' '和0

遇到此类问题:建议写:

function f(a) {

(a !== undefined && a !== null) ? a = a : a = 1

return a

}

f() // 1

f(' ') // ' '

f(0) // 0

4.4 传递方式

在函数中,如果传递的是数值、字符串、布尔值,那么拷贝原始值,函数内部的修改不起作用。

但如果传递的值是复合型:例如数组、对象、其他函数,如果在函数内部修改,会影响原始值。

如果是替换掉整个复合型数据,就不会影响原始值!

4.5 同名参数

如果有同名参数,取后面出现的值

function f(a,a){

console.log(a)

}

f(1,2) // 2

即使后面的值缺省,也是取后面的值

function(a,a){

console.log(a)

}

f(1) // 1


4.6 argument对象

(1)它可以读取传过来参数的个数

console.log(arguments[0])

其参考对象是f(1,2,3)=》//arguments.length=3

(2)可以将数组转为真正可用的数组:

var args=Array.prototype.slice.call(arguments)

(3)callee属性可以读取到 它所对应的原函数

var f=function(one){

console.log(arguments.callee === f)

}

f() // true


5 OTHER

5.1 闭包

*如何在局部作用域中取出数据:*/

functionf1() {

  var n=999

functionf2() {

  console.log(n)}

f2()

}

f1()

/*上面的f2就是闭包,定义在一个函数内部的函数

*闭包的用处:

* 1、获取到函数内部的数据

* 2、让这些变量始终保持在内存中,既闭包使内部变量记住上一次调用的运算结果

* 3、封装对象的私有属性和方法*/

5.2 IIFE 立即调用(自己执行)

格式:

(function(){ code  }());

new function(){ code }

new function(){ code }()//后面的括号用于传参

(function(){

code

}());

目的:

一、是不必为函数命名,避免了污染全局变量;

二、是IIFE内部形成了一个单独的作用域,可以封装一些外部无法读取的私有变量。

参考链接:http://javascript.ruanyifeng.com/grammar/function.html#toc8

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,565评论 6 479
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,021评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,003评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,015评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,020评论 5 370
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,856评论 1 283
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,178评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,824评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,264评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,788评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,913评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,535评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,130评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,102评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,334评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,298评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,622评论 2 343

推荐阅读更多精彩内容

  • 三、闭包和高阶函数 3.1 闭包 3.1.1 变量的作用域 所谓变量的作用域,就是变量的有效范围。通过作用域的划分...
    梁同学de自言自语阅读 1,444评论 0 6
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,718评论 2 17
  • 函数声明和函数表达式有什么区别 (*)解析器会率先读取函数声明,并使其在执行任何代码之前可以访问;函数表达式则必须...
    coolheadedY阅读 383评论 0 1
  • 继承 一、混入式继承 二、原型继承 利用原型中的成员可以被和其相关的对象共享这一特性,可以实现继承,这种实现继承的...
    magic_pill阅读 1,050评论 0 3
  • 拖延症,工作的时候,刚开始觉得时间挺多,觉得晚上没睡好,对问题一团浆糊,一团乱麻,不知从何下手,就先玩一下,看一下...
    陆pp阅读 203评论 0 0