js基础练习题(3)

沉默术士
• 阅读 122

8.this

1.举例说说apply方法和call方法的作用和区别

2.读下面代码,写程序结果

function identify () {
  return this.name.toUpperCase()
}

function speek () {
  var greeting = 'hello, 我是' + identify.call(this)
  console.log(greeting)
}

var p1 = {
  name: 'xiaoHong'
}
var p2 = {
  name: 'XiaoLi'
}
identify.call(p1)   // 输出?
identify.call(p2)   // 输出?
speek.call(p1)      // 输出?
speek.call(p2)      // 输出?

3.读下面代码,写程序结果

function foo (num) {
  console.log('foo:' + num)
  this.count++
}
foo.count = 0
for (var i = 0; i < 10; i++) {
  if ( i > 5) {
    foo(i)
  }
}
console.log('foo.count被调用了多少次?:'+foo.count)

4.this到底是什么?

1、this的绑定和函数的声明位置没有关系,只取决于函数的调用方式
2、当一个函数被调用时,会创建一个活动记录(有时候也称为执行上下文)。这个记录会包含函数在哪里调用、函数的调用方式、传入的参数等信息,this就是这个活动记录的一个属性,会在函数执行的过程中用到

5.读下面代码,写出运行结果(知识点,默认绑定)

function foo () {
  console.log(this.a)
}
var a = 2
foo()   //输出?
function foo () {
  "use strict"
  console.log(this.a)
}
var a = 2
foo()  // 输出?
function foo () {
  console.log(this.a)
}
var a = 2
;(function () {
  "use strict"
  foo()
})()

6.读下面代码,写出运行结果(知识点,隐式绑定)

function foo () {
  console.log(this.a)
}
var obj = {
  a: 2,
  foo: foo
}
obj.foo()  // 输出?
function foo () {
  console.log(this.a)
}
var obj2 = {
  a: 42,
  foo: foo
}
var obj1 = {
  a: 2,
  obj2: obj2
}
obj1.obj2.foo() //输出?

7.读下面代码,写出运行结果(知识点,绑定丢失)

function foo () {
  console.log(this.a)
}
var obj = {
  a: 2,
  foo: foo
}
var bar = obj.foo
var a = '我是全局属性a'
bar()  //输出?
function foo () {
  console.log(this.a)
}
function doFoo (fn) {
  fn()
}
var obj = {
  a: 2,
  foo: foo
}
var a = '我是全局变量a'
doFoo(obj.foo)  //输出?
function foo () {
  console.log(this.a)
}
var obj = {
  a: 2,
  foo: foo
}
var a = '我是全局变量a'
setTimeout(obj.foo, 100) // 输出

8.读下面代码,写出运行结果(知识点,call)

function foo () {
  console.log(this.a)
}
var obj = {
  a: 2
}
foo.call(obj)  //输出多少?

思考,如何解决绑定丢失问题?直接使用call方法能不能实现?

9.读下面代码,写出运行结果(知识点,硬绑定)

function foo (something) {
  console.log(this.a, something)
  return this.a + something
}
var obj = {
  a: 2
}
var bar = function () {
  return foo.apply(obj, arguments)
}
var b = bar(3)  //输出多少?
console.log(b)  //输出多少?

10.简单写一个通用的辅助函数bind

function foo (something) {
  console.log(this.a, something)
  return this.a + something
}

function bind(fn, obj) {
  // 补充代码
  ...
}
var obj = {
  a: 2
}
var bar = bind(foo, obj)

var b = bar(3)  // 2 3
console.log(b)  // 5

11.读下面代码,写出运行结果(知识点,new绑定)

function foo (a) {
  this.a = a
}
var bar = new foo(2)
console.log(bar.a) //输出多少?

12.读下面代码,写出运行结果(知识点,箭头函数的this)

function foo () {
  return (a) => {
    console.log(this.a)
  }
} 
var obj1 = {
  a: 2
}
var obj2 = {
  a: 3
}
var bar = foo.call(obj1)
bar.call(obj2)  //输出多少?
function foo() {
  setTimeout(() => {
    console.log(this.a)
  }, 100)
}
var obj = {
  a: 2
}
foo.call(obj)  //输出多少?

13.总结判断this指向的方法

1. 函数是否在new中调用?如果是的话this指向的是新创建的对象

2.函数是否通过call、apply或者硬绑定调用?如果是的话,this指向的是指定的对象

3.函数是否在某个上下文对象中调用?如果是的话,this指向的是那个上下文对象

4.如果都不是的话,使用默认绑定,如果在严格模式下,绑定到undefined,否则指向全局对象
点赞
收藏
评论区
推荐文章
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
巴拉米 巴拉米
4年前
bind、call、apply 区别?如何实现一个bind?
一、作用call、apply、bind作用是改变函数执行时的上下文,简而言之就是改变函数运行时的this指向那么什么情况下需要改变this的指向呢?下面举个例子var name"lucy";const obj{    name:"martin",    say:function (){        co
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
Java日期时间API系列31
  时间戳是指格林威治时间1970年01月01日00时00分00秒起至现在的总毫秒数,是所有时间的基础,其他时间可以通过时间戳转换得到。Java中本来已经有相关获取时间戳的方法,Java8后增加新的类Instant等专用于处理时间戳问题。 1获取时间戳的方法和性能对比1.1获取时间戳方法Java8以前
小嫌 小嫌
3年前
bind()与call()和apply()之间的区别
具体内容以及示例可参见网站:需要记住的基本规则1."this"指代一个对象2."this"指的是调用它包含的函数的对象。3.在全局上下文中,“this”指的是窗口对象,或者如果使用“严格模式”则是未定义的。varcarregistrationNumber:"GA12345",brand:"Toyota",dis
OMG!Java高级开发岗必问知识点
目录1.Mysql2.CHAR与VARCHAR的区别?3.能说下myisam和innodb的区别吗?4.你能说下事务的基本特性和隔离级别吗?5.并发问题脏读、不可重复读、幻读?6.事务的隔离级别?7.说说自增主键、UUID?8.mysql的约束分类?9.drop、delete与tru
Stella981 Stella981
3年前
NIO之Buffer的clear()、rewind()、flip()方法的区别
Java的NIO中有关Buffer的几种常用方法比如clear,rewind和flip到底有哪些区别。下面给大家这三种方法的源码,方便大家记忆。clear()方法用于写模式,其作用为情况Buffer中的内容,所谓清空是指写上限与Buffer的真实容量相同,即limitcapacity,同时将当前写位置置为最前端下标为0处。代码如下:1.pu
Stella981 Stella981
3年前
JS 中的this指向问题和call、apply、bind的区别
this的指向问题一般情况下this对象指向调用函数的对象,全局环境中执行函数this对象指向window。functiona(){console.log(this);//输出函数a中的this对象}functionb(){};varc{name:"call"}
Stella981 Stella981
3年前
JavaScript中call()与apply()有什么区别?
今天读《JavaScript权威指南》时发现其中有段代码用到了apply方法用于递归实现数组的展开。可是我不懂这个函数的用法,因此查了一下,将资料整理如下。Javascript的每个Function对象中有一个apply方法:function.apply(thisObj,argArray)还有一个类似功能的call方法:
Stella981 Stella981
3年前
Python计算大文件行数方法及性能比较
如何使用Python快速高效地统计出大文件的总行数,下面是一些实现方法和性能的比较。1.readline读所有行使用readlines方法读取所有行:defreadline_count(file_name):returnlen(open(file_name).readlines())