day9

1-说说你对 this 的理解

1. 不像C#,this一定是指向当前对象。

js的this指向是不确定的,也就是说是可以动态改变的。call/apply 就是用于改变this指向的函数,这样设计可以让代码更加灵活,复用性更高。

2. this 一般情况下,都是指向函数的拥有者。

3. 函数自执行就是特殊情况,在函数自执行里,this 指向的是:window

 1. 使用标签属性注册事件,此时this 指向的是 window 对象。

  <input id="test" type="button" value="按钮" onClick="test()"/>
    function test(){alert(this)}

 2. 对于1,要让 this 指向 input,可以将 this 作为参数传递。

 3. 使用 addEventListener 等注册。此时this 也是指向 input。

   document.getElementById("test").addEventListener("click",test);

在HTML元素事件属性中inline方式使用this关键字:

用DOM方式在事件处理函数中使用this关键字:

用DHTML方式在事件处理函数中使用this关键字:

 类定义中使用this关键字:

        为脚本引擎内部对象添加原形方法中的this关键字:

CSS的expression表达式中使用this关键字:

函数中的内部函数中使用this关键字:

归纳起来,JavaScript中的this用法有以下3种:

    1.在HTML元素事件属性 或 CSS的expression表达式 中inline方式使用this关键字——对应原文的1、7

    2.在事件处理函数中使用this关键字——对应原文的2、3

      其中可分为两种方式

      (1)DOM方式——此种方式的结果是this指向窗口(window)对象

      (2)DHTML方式——此种方式的结果是this指向div元素对象实例

 

 

2-call\apply\bind 的区别和联系?

call,apply,bind这三个方法其实都是继承自Function.prototype中的,属于实例方法。

console.log(Function.prototype.hasOwnProperty('call')) //true

console.log(Function.prototype.hasOwnProperty('apply')) //true

console.log(Function.prototype.hasOwnProperty('bind')) //true

上面代码中,都返回了true,表明三种方法都是继承自Function.prototype的。当然,普通的对象,函数,数组都继承了Function.prototype对象中的三个方法,所以这三个方法都可以在对象,数组,函数中使用

Function.prototype.call()

  函数实例的call方法,可以指定该函数内部this的指向(即函数执行时所在的作用域),然后在所指定的作用域中,调用该函数。并且会立即执行该函数。

call()方法可以传递两个参数。第一个参数是指定函数内部中this的指向(也就是函数执行时所在的作用域),第二个参数是函数调用时需要传递的参数。

call方法的一个应用是调用对象的原生方法。也可以用于将类数组对象转换为数组。

Function.prototype.apply()

  apply方法的作用与call方法类似,也是改变this指向(函数执行时所在的作用域),然后在指定的作用域中,调用该函数。同时也会立即执行该函数。唯一的区别就是,它接收一个数组作为函数执行时的参数。

apply方法的第一个参数也是this所要指向的那个对象,如果设为null或undefined或者this,则等同于指定全局对象。第二个参数则是一个数组,该数组的所有成员依次作为参数,在调用时传入原函数。原函数的参数,在call方法中必须一个个添加,但是在apply方法中,必须以数组形式添加。

Javascript中是没有提供找出数组中最大值的方法的,结合使用继承自Function.prototype的apply和Math.max方法,就可以返回数组的最大值。

通过apply方法,利用Array构造函数将数组的空元素变成undefined

空元素与undefined的差别在于,数组的forEach方法会跳过空元素,但是不会跳过undefined和null。因此,遍历内部元素的时候,会得到不同的结果。

另外,利用数组对象的slice方法,可以将一个类似数组的对象(比如arguments对象)转为真正的数组。当然,slice方法的一个重要应用,就是将类似数组的对象转为真正的数组。call和apply都可以实现该应用。

Function.prototype.bind()

  bind方法用于指定函数内部的this指向(执行时所在的作用域),然后返回一个新函数。bind方法并非立即执行一个函数。

.我们也可以给bind方法传递参数,第一个参数如果为null或者undefined或者this,会将函数内部的this对象指向全局环境;第二个为调用时需要的参数,并且传递参数的形式与call方法相同。

call和apply方法都是在调用之后立即执行的。而bind调用之后是返回原函数,需要再调用一次才行

call,apply,bind方法的联系和区别

  其实用于指定函数内部的this指向的问题,这三个方法都差不多,只是存在形式上的差别。读者可以将以上的例子用三种方法尝试用三种方法实现。

  总结一下call,apply,bind方法:

  a:第一个参数都是指定函数内部中this的指向(函数执行时所在的作用域),然后根据指定的作用域,调用该函数。

  b:都可以在函数调用时传递参数。call,bind方法需要直接传入,而apply方法需要以数组的形式传入。

  c:call,apply方法是在调用之后立即执行函数,而bind方法没有立即执行,需要将函数再执行一遍。有点闭包的味道。

  d:改变this对象的指向问题不仅有call,apply,bind方法,也可以使用that变量来固定this的指向。

 

3-下面代码执行的结果是什么?

hello one

hello four

hello three

hello two

4-下面代码执行的结果是什么?

posted @ 2021-02-23 14:01  雨辰~  阅读(67)  评论(0)    收藏  举报