国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

call() 與 apply() 和 bind()

DTeam / 1497人閱讀

摘要:但是當(dāng)構(gòu)造函數(shù)顯示返回一個對象時就會將這個對象賦值給變量,的使用則無效。將參數(shù)全都傳入,它會把參數(shù)作為數(shù)組傳入。

首先了解this

如果想用好這幾個方法,需要先了解this被調(diào)用方式不同而導(dǎo)致值不同的各種情況,然后就會認(rèn)識到使用這幾個方法的原因在哪里。(可以指定this的值)
全局上下文中this指向全局對象,函數(shù)上下文this取決于被調(diào)用的方式

例:

在非嚴(yán)格模式下,全局調(diào)用函數(shù)this默認(rèn)指向全局(window)

var a = 3

function exp(){
  var a = 4
  console.log(this.a)
}

var b = exp()
// 輸出3

在嚴(yán)格模式下,因為this為其進(jìn)入上下文時的值,所以為undefined

function exp(){
 "use strict"
  return this
}

console.log(exp() === undefined)
// 輸出 true

下面分析各個調(diào)用場合下this的值

作為函數(shù)被直接調(diào)用

上面已經(jīng)寫出了這種情況,值得注意的是,我們往往并不需要this值為window

作為方法被調(diào)用

作為方法被調(diào)用時,this指向方法所在的對象上
例:

var exp =  {
  obj: function context() {
     var text = "hello"
     return this 
  }
}

console.log(exp.obj() === exp)
var a = exp.obj()
console.log(a === exp)

var b = exp.obj
console.log(b() === window) //true,,注意這里當(dāng)對象的方法被全局調(diào)用后this是b的this,則是window

//均輸出 true
作為構(gòu)造函數(shù)被調(diào)用

我們知道構(gòu)造函數(shù)創(chuàng)建一個對象的過程

創(chuàng)建新對象

新對象作為this指向的對象

為新對象添加方法、屬性、、并返回對象

需要注意的地方:構(gòu)造函數(shù)返回一個非對象類型時,創(chuàng)建新對象時并不妨礙this的使用,也會返回新創(chuàng)建的對象。但是當(dāng)構(gòu)造函數(shù)顯示返回一個對象時就會將這個對象賦值給變量,this的使用則無效。

function Fn (){
  this.obj = function() {
    return this
  }
}

let a = new Fn()
console.log(a.obj() === Fn) // false
console.log(a.obj() === a) //true

let newObj = {
  name: "小明"
}

function reObj (){
  this.name = "康康"
  return newObj
}

let b = new reObj()
console.log(b.name) //小明,返回的對象是newObj

進(jìn)入正題,在這么多變化中隨時都可能出錯,所以call()、apply()、bind()就提供了一個可以指定this的方式

方法的使用

call()

這個方法接受多個參數(shù),第一個參數(shù)是指定的this值,剩下的都是調(diào)用的函數(shù)的參數(shù)列表
fn.call(this, arg1, arg2, ...);
如果第一個參數(shù)需要是對象,如果傳入了數(shù)字、字符串、布爾值的話this會指向該原始值的自動包裝對象

function f(){
      console.log(this)
      console.log(arguments)
  }
  f.call() // window
  f.call({name:"小明"}) // {name: "小明"}, []
  f.call({name:"小紅"},1) // {name: "小紅"}, [1]
  f.call({name:"康康"},1,2) // {name: "康康"}, [1,2]

apply()

apply() 與call()區(qū)別在于第二個參數(shù)接受的是一個包含多個參數(shù)的數(shù)組,對于一些方法需要傳入的參數(shù)不能使數(shù)組,可以使用apply()調(diào)用函數(shù)使其可以使用數(shù)組作為參數(shù)。

var a = [1,2,3,4,5,6,7,8,9]
sum.apply(null,a)
//將參數(shù)a全都傳入,它會把參數(shù)作為數(shù)組傳入。

//求數(shù)組的最大元素
Math.max.apply(null,[1,2,6]) // 6

很多使用場景都可以被es6里的擴展運算符替代

bind()

bind()方法創(chuàng)建一個新的函數(shù), 當(dāng)被調(diào)用時,將其this關(guān)鍵字設(shè)置為提供的值.

this.name = "大牛"

let obj = {
  name: "康康",
  age: 18,
  city:"上海"
}

let newObj =  {
  name: "小明",
  sayName: function() {
    console.log(this.name)
  }
}

newObj.sayName()// 小明

let a = newObj.sayName.bind(obj)
a() //康康

let b = newObj.sayName
b() //大牛

箭頭函數(shù)
這里說一下箭頭函數(shù),因為箭頭函數(shù)沒有this,所以會根據(jù)作用域鏈進(jìn)行尋找this,這也衍生了很多用法,比如在setTimeout里經(jīng)常出現(xiàn)的上下文(作用域)問題,如果不使用箭頭函數(shù),在函數(shù)運行時作用域就變成了全局,使用箭頭函數(shù)會使函數(shù)里用到的this綁定在setTimeout的作用域上

var timer = {
fn1() {
    setTimeout(function(){
        console.log(this)
    }, 10)
},
fn2() {
    setTimeout(()=>{
        console.log(this)
    },20)
},
fn3: ()=> {
    setTimeout(()=>{
        console.log(this)
    },30)        
}
 }
 timer.fn1() //window
 timer.fn2() // timer
 timer.fn3() //window
 
 //第一個在執(zhí)行時是在全局調(diào)用,相當(dāng)于 fn1.call(undefined)
 // 第二個使用箭頭函數(shù)自身沒this,使this 指向了timer
 // 第三個自身沒this的情況下,根據(jù)箭頭函數(shù)的規(guī)則找到了最外層全局(window)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/107691.html

相關(guān)文章

  • bindcallapply的區(qū)別實現(xiàn)原理

    摘要:簡單說一下的區(qū)別三者都是用于改變函數(shù)體內(nèi)的指向,但是與和的最大的區(qū)別是不會立即調(diào)用,而是返回一個新函數(shù),稱為綁定函數(shù),其內(nèi)的指向為創(chuàng)建它時傳入的第一個參數(shù),而傳入的第二個及以后的參數(shù)作為原函數(shù)的參數(shù)來調(diào)用原函數(shù)。原文鏈接的區(qū)別與實現(xiàn)原理 1、簡單說一下bind、call、apply的區(qū)別   三者都是用于改變函數(shù)體內(nèi)this的指向,但是bind與apply和call的最大的區(qū)別是:bi...

    oliverhuang 評論0 收藏0
  • javascript中call(),apply().bind()方法的作用異同

    摘要:原文章發(fā)表在的個人博客一細(xì)節(jié)中函數(shù)存在定義時上下文,運行時上下文上下文是可變的為改變某個函數(shù)運行時的上下文而存在的,換句話說,是為了改變函數(shù)內(nèi)部的指向沒有方法,但是有呀所以可以去把方法的運行時上下文也就是運行時的的指向,指向這個時候低啊用 原文章發(fā)表在 Klay-Clam的個人博客 一、細(xì)節(jié) javascript 中函數(shù)存在定義時上下文,運行時上下文 上下文是可變的 1. call...

    Near_Li 評論0 收藏0
  • 「干貨」細(xì)說 callapply 以及 bind 的區(qū)別用法

    摘要:的調(diào)用者,將會指向這個對象。此外,還可以擴展自己的其他方法。的使用最后來說說。不同的是,方法的返回值是函數(shù),并且需要稍后調(diào)用,才會執(zhí)行。而和則是立即調(diào)用。總結(jié)和的主要作用,是改變對象的執(zhí)行上下文,并且是立即執(zhí)行的。 前言 上一篇文章 《「前端面試題系列4」this 的原理以及用法》 中,提到了 call 和 apply。 它們最主要的作用,是改變 this 的指向。在平時的工作中,除了...

    GraphQuery 評論0 收藏0
  • js 面試官想了解你有多理解call,apply,bind?

    摘要:返回值這段在下方應(yīng)用中有詳細(xì)的示例解析。回調(diào)函數(shù)丟失的解決方案綁定回調(diào)函數(shù)的指向這是典型的應(yīng)用場景綁定指向,用做回調(diào)函數(shù)。 showImg(https://segmentfault.com/img/remote/1460000019971331?w=1024&h=680); 函數(shù)原型鏈中的 apply,call 和 bind 方法是 JavaScript 中相當(dāng)重要的概念,與 this...

    wuaiqiu 評論0 收藏0
  • call() , apply() bind() 實例詳解

    摘要:當(dāng)沒有使用而直接調(diào)用時指向?qū)ο蠛瘮?shù)和函數(shù)非常的相似,第一個參數(shù)都用來設(shè)置目標(biāo)函數(shù)運行時的指向。輸出的結(jié)果為結(jié)果證明兩個地方傳入的參數(shù)都會被傳給目標(biāo)函數(shù),函數(shù)拷貝調(diào)用時傳入的參數(shù)會追加在函數(shù)調(diào)用時傳入的參數(shù)后面。 call() , apply() 與 bind() 詳解 我們知道可以用call(), apply() 和 bind()這三個函數(shù)都是用來完成函數(shù)調(diào)用,并且設(shè)置this指向。 ...

    wayneli 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<