js的函数/面试知识相当密集

函数的五种声明方式



console.log的源代码就是这样的

console.log打印出来的和返回的没关系。不用管他为什么返回undefined,因为它源代码写了

1.具名函数


函数格式

没有返回值的话一般会写一个return undefined就算你不写return undefind 也会自动给你补上。

2.匿名函数

匿名函数需要先给一个变量,然后赋值给变量要不然会报错


3.把有名字的函数赋值给变量


但是比如var x = function y (){},然后你console.log(y)的时候会报错,因为这个y只能在x内部用,你在外面是会报错的。y的作用域在里面。然后你console.log(x)的话会打出y(){}。这个居然面试经常考。

4.


里面都是字符串,用字符串拼接。这个这么奇怪有人用吗?

5.最炫的


如果只有一句话可以把return和{}都去掉。如果函数体里面内容太多的话可以用enter或者用分号隔开。



如果参数只有一个,那么()可以去掉。


那以后可以都用这个方法。所以其实就是把function变成了=>,然后如果只有一个参数就能少了()只有一句return的话可以省略{}和return。不过看着高级很多。



name




变量是直接用的,用函数叫做调用

call

函数到底是啥,内存是怎么存的


stack里面就放了f这个变量名,f的内容是object的地址,objec里面存放了函数的代码,全部以字符串的形式存着。另外这个object有一个--proto--:Function 指向函数的公共属性。这个公共属性里面有一个call的API可以调用函数。

函数=函数名+参数+函数体

再回顾一遍


只有Function这个天生的对象有__proto__和prototype


n是函数,要通过n.prototype查看n的公共属性,n.__proto__行不通

eval:给字符串,然后把字符串当代码执行

自己造一个函数,先搞个对象,然后加一个call的属性,call里面用eavl把函数执行了

所以执行函数的时候平时直接f()实际上是f.call(),所以直接打f没用,出来的是这个函数的代码。打f()才能执行函数体的结果。

函数终极问题:可以执行代码的对象,叫做函数


这是js数据结构的知识体系,函数主要特殊在他的公共属性,有call,apply,bind还重写了toString本来object公共属性有toString的。一般都用 它的,函数用自己的toString。还有其他一些对象比如Date Error等

世纪难题:

为什么大家不用f.call(undefined,1,2)而是用f(1,2),第一种才是正确的,以后调用都这么写。因为第二种对学this很有帮助,第一种不行。



反正听方方的没错,以后都用f.call(undefined,1,2)就行了



this和arguments



普通模式下,如果this是undefined浏览器会默认把this变成window


如果用'use strict'开启严格模式,那this就是undefined


如果f.call()传入其他参数,那么this就会打出其他参数。反正结果就是f.call的第一个参数就是this,后面所有参数加起来是arguments

那this怎么来的呢?为啥要有this


就跟new Number没人用,f = new Function()没人用一样,this也是当初设计的时候强行要像java所以js之父没办法就放到f.call里面去了。目的是吸引java程序员来学js,然后学了以后发现果然是长得像还可以更方便,然后就上当了。所以这些东西都是打广告用的。

arguments就是除了第一个参数后面的参数。这些参数会组成一个伪数组。啥是伪数组?__proto__ 不等于array.prototype的。上面__proto__是指向Object的不是指向array。所以它看着像数组但是没有数组的公共属性,不能用数组的API,比如push这些都不能用。


正常的数组是会指向Array的。

方方说得画内存图就是画原型链


call stack

之所以存在stack是因为本来内存按顺序每个地址上面放了代码。然后按地址顺序开始执行代码,突然到了function a这里发现这个a的内容是其他函数的地址,那就得跳到那个函数去执行啊。那待会儿我怎么回来呢?那就用一个叫stack的放a的地址,待会我回来就去stack里面拿地址。

但是如果function a内部又有函数functionb、b里面又有function c怎么办呢?同样再把这个function b、function c的地址放到stack里面把,待会c的函数执行完了我再看一下stack就行了。

那现在stack里面放了三个函数的地址了。我计算机会先拿哪个地址呢?如果我拿了a的地址,那我c执行完直接回到主函数去了,因为a在主函数上。所以a,b都没执行完啊。因为我是a执行了一半去b的,b执行到一半去c的。本来c执行完我是要拿到c的地址继续执行b剩下代码,然后拿到b地址执行a剩下代码,然后拿到a地址执行主函数代码。

所以从结论上就是新进后出,从计算机上看它只要去找stack里面放的地址,从上往下一个个拿就行了,不用多想。如果没了那就执行主函数。

1.function a(){

        function b(){}    

        function c(){}

}

2.function a(){

        function b(){

            function c(){}

    }

}

注意1,2的stack是不一样的。

1的顺序是:1.a入栈 2.b入栈 3.b出栈 4.c入栈 5.c出栈 6.a出栈

2的顺序是:1.a入栈 2.b入栈 3.c入栈 4.c出栈 5.b出栈 6.a出栈


判断语句也会入栈

上面同一时间压了5次栈,如果同意栈太多会不会不够呢?


会报错,叫做stack overflow是栈溢出的意思


有句话叫做声明的时候不加var就在声明全局变量,这句话是不完全正确的。


这种情况下,在f1里面a = 3,它会认为在给a赋值,然后在f1里面找a有没有声明。发现没有就去找全局发现有了,然后就给这个全局的a赋值。


这种情况,如果a = 3找了f1发现没有,就在全局有没有声明。发现还是没有,那除了赋值就顺便声明了一下a然后作为全局变量。然后再赋值。

所以f2的a如果要想是局部变量,必须得加var,要不然会往上查,查到声明为止然后再赋值。

找声明不会往下找

浏览器拿到代码以后第一步就是变量提升,把全局,局部全部找好。文字好懂,实际容易错。


为啥console.log(a)打印出undefined呢?因为变量提升!!!!


变量提升以后就这个样子了,所以console.log(a)的时候a在f1的范围内只做了声明还没有赋值。只声明没赋值就是undefined




a =2 在 f4.call()前面的话,f4.call()打印出来a是2,如果a = 2 在 f4.call()后面,那打印出来就是  a = 1



闭包

想知道细节就搜:方应杭 闭包



课后题:






















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

推荐阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 13,780评论 0 38
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,460评论 1 45
  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,599评论 1 19
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,551评论 0 5