2020-04-04 JavaScript高级

函数进阶

定义函数的三种方式

  • 函数声明

fn();//函数声明可以先调用,在声明

function fn(){

console.log("这是函数声明")

}

  • 函数表达式

var fn = function() {

console.log("这是函数表达式");

}

fn();//函数表达式必须先声明,再调用

  • 构造函数Function

//函数也是对象,可以使用Function构造函数new出来

//相当于var fn = function(){}

var fn = new Function();

//语法:new Function(arg1,arg2,arg3..,body);

// 1\. 所有的参数都是字符串类型。

// 2\. 前面可以定义任意多个形参,最后一个参数是代码体。

var fn = new Function("alert(1111)");

fn();

var fn1 = new Function("a1", "a2", "alert(a1+a2)");

fn1(1,2);

函数也是对象

  • 函数是由new Function创建出来的,因此函数也是一个对象,所有函数都是new Function的实例
image.png

Function.prototype常用成员

  • call:调用函数,重新指向this
  • apply:调用函数,重新指向this
  • bind:重新指向this,返回一个新的函数,不调用

完整版原型链

  • 所有函数都是new Function创建出来的,因此 所有函数.proto都是Function.prototype
  • 所有对象都是new Object创建出来的,因此 所有对象.proto都是Object.prototype
image.png

作用域

  • 变量起作用的区域,变量定义后,可以在哪个范围内使用
    • 在js中只有全局作用域和函数作用域
    • 函数作用域在函数定义的时候作用域就定下来了,和函数在哪调用无关

作用域链

  • 只要是函数,就会形成一个作用域,如果这个函数被嵌套在其他函数中,那么外部函数也有自己的作用域,这个一直往上到全局作用域,就形成了一个作用域链

变量搜索原则

  1. 从当前的作用域开始查找,存在即返回
  2. 不存在,就往上一层找,存在即返回
  3. 一直查询到全局作用域,存在即返回。没有就报错

函数调用的四种模式

  • 根据函数内部的this指向不同,可以将函数的调用模式分为4类
  1. 函数调用模式
    如果一个函数不是一个对象的属性时,就是被当作一个函数来进行调用,此时this指向window

function fn(){

console.log(this);//指向window

}

fn();
  1. 方法调用模式

    当一个函数被保存为对象的一个属性时,我们称之为方法。当一个方法被调用时,this被绑定到当前对象


var obj = {

sayHi:function(){

console.log(this);//在方法调用模式中,this指向调用当前方法的对象。

}

}

obj.sayHi();

  1. 构造函数调用模式

    如果函数是通过new关键字进行调用的,此时this被绑定到创建出来的新对象上


function Person(){

console.log(this);

}

Person();//this指向什么?

var p = new Person();//this指向什么?

  1. 上下文调用模式

    a. 函数.call():可以调用一个函数,并且可以指定这个函数的this指向
    b. 函数.apply():和call()的作用类型,此方法接收的参数是一个包含多个参数的数值
    c. 函数.bind():创建一个新的函数,可以绑定新的函数的this指向

//所有的函数都可以使用call进行调用
//参数1:指定函数的this,如果不传,则this指向window
//其余参数:和函数的参数列表一模一样。
//说白了,call方法也可以和()一样,进行函数调用,call方法的第一个参数可以指定函数内部的this指向。

fn.call(thisArg, arg1, arg2, arg2);

// 返回值:新的函数
// 参数:新函数的this指向,当绑定了新函数的this指向后,无论使用何种调用模式,this都不会改变。

var newFn = fn.bind(window);

补充

  • 几种特殊的this指向

    • 定时器的this指向window,因为定时器的function最终由window来调用
    • 事件中的this指向的是当前的元素,在事件触发的时候,浏览器让当前元素调用了function
  • 伪数组与数组

    • 伪数组其实就是一个对象,但是和数组一样有length属性,也有0,1,2,3等属性
    • 伪数组没有数组的方法,不能使用push等方法
    • 伪数组可以跟数组一样进行遍历,通过下标操作
    • 常见的伪数组:arguments,document,getElementByTagName的返回值,jQuery对象
  • 我们可以让伪数组借用数组方法


var arrayLike = {

0:"张三",

1:"李四",

2:"王五",

length:3

}

//伪数组可以和数组一样进行遍历

Array.prototype.push.call(arrLike, "赵六");

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