全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

JavaScript方法_动力节点Java学院整理

在一个对象中绑定函数,称为这个对象的方法。

在JavaScript中,对象的定义是这样的:

var xiaoming = {
 name: '小明',
 birth: 1990
};

但是,如果我们给xiaoming绑定一个函数,就可以做更多的事情。比如,写个age()方法,返回xiaoming的年龄:

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: function () {
  var y = new Date().getFullYear();
  return y - this.birth;
 }
};

xiaoming.age; // function xiaoming.age()
xiaoming.age(); // 今年调用是25,明年调用就变成26了

绑定到对象上的函数称为方法,和普通函数也没啥区别,但是它在内部使用了一个this关键字,这个东东是什么?

在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以, this.birth可以拿到xiaomingbirth属性。

让我们拆开写:

function getAge() {
 var y = new Date().getFullYear();
 return y - this.birth;
}

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: getAge
};

xiaoming.age(); // 25, 正常结果
getAge(); // NaN

单独调用函数getAge()怎么返回了NaN?请注意,我们已经进入到了JavaScript的一个大坑里。

JavaScript的函数内部如果调用了this,那么这个this到底指向谁?

答案是,视情况而定!

如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,这是符合我们预期的。

如果单独调用函数,比如getAge() ,此时,该函数的this指向全局对象,也就是window

坑爹啊!

更坑爹的是,如果这么写:

var fn = xiaoming.age; // 先拿到xiaoming的age函数
fn(); // NaN

也是不行的!要保证this指向正确,必须用obj.xxx()的形式调用!

由于这是一个巨大的设计错误,要想纠正可没那么简单。ECMA决定,在strict模式下让函数的this指向undefined,因此,在strict模式下,你会得到一个错误:

'use strict';

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: function () {
  var y = new Date().getFullYear();
  return y - this.birth;
 }
};

var fn = xiaoming.age;
fn(); // Uncaught TypeError: Cannot read property 'birth' of undefined

这个决定只是让错误及时暴露出来,并没有解决this应该指向的正确位置。

有些时候,喜欢重构的你把方法重构了一下:

'use strict';

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: function () {
  function getAgeFromBirth() {
   var y = new Date().getFullYear();
   return y - this.birth;
  }
  return getAgeFromBirth();
 }
};

xiaoming.age(); // Uncaught TypeError: Cannot read property 'birth' of undefined

结果又报错了!原因是this指针只在age方法的函数内指向xiaoming,在函数内部定义的函数,this又指向undefined了!(在非strict模式下,它重新指向全局对象window!)

修复的办法也不是没有,我们用一个that变量首先捕获this

'use strict';

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: function () {
  var that = this; // 在方法内部一开始就捕获this
  function getAgeFromBirth() {
   var y = new Date().getFullYear();
   return y - that.birth; // 用that而不是this
  }
  return getAgeFromBirth();
 }
};

xiaoming.age(); // 25

var that = this;,你就可以放心地在方法内部定义其他函数,而不是把所有语句都堆到一个方法中。

apply

虽然在一个独立的函数调用中,根据是否是strict模式,this指向undefinedwindow,不过,我们还是可以控制this的指向的!

要指定函数的this指向哪个对象,可以用函数本身的apply方法,它接收两个参数,第一个参数就是需要绑定的this变量,第二个参数是Array,表示函数本身的参数。

apply修复getAge()调用:

function getAge() {
 var y = new Date().getFullYear();
 return y - this.birth;
}

var xiaoming = {
 name: '小明',
 birth: 1990,
 age: getAge
};

xiaoming.age(); // 25
getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空

另一个与apply()类似的方法是call() ,唯一区别是:

  1. apply()把参数打包成Array再传入;
  2. call()把参数按顺序传入。

比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:

Math.max.apply(null, [3, 5, 4]); // 5
Math.max.call(null, 3, 5, 4); // 5

对普通函数调用,我们通常把this绑定为null。

装饰器

利用apply() ,我们还可以动态改变函数的行为。

JavaScript的所有对象都是动态的,即使内置的函数,我们也可以重新指向新的函数。

现在假定我们想统计一下代码一共调用了多少次parseInt() ,可以把所有的调用都找出来,然后手动加上count += 1,不过这样做太傻了。最佳方案是用我们自己的函数替换掉默认的parseInt():

var count = 0;
var oldParseInt = parseInt; // 保存原函数

window.parseInt = function () {
 count += 1;
 return oldParseInt.apply(null, arguments); // 调用原函数
};

// 测试:
parseInt('10');
parseInt('20');
parseInt('30');
count; // 3


# JavaScript方法  # js定义方法  # 显示js对象所有属性和方法的函数  # javascript中声明函数的方法及调用函数的返回值  # js 把字符串当函数执行的方法  # JavaScript函数的4种调用方法详解  # javascript定义函数的方法  # js中匿名函数的创建与调用方法分析  # 小明  # 绑定  # 模式下  # 自己的  # 重构  # 的是  # 而不是  # 都是  # 是一个  # 这是  # 还可以  # 第一个  # 让我们  # 你会  # 是这样  # 可以用  # 这是一个  # 错了  # 要想  # 第二个 


相关文章: 如何通过虚拟机搭建网站?详细步骤解析  制作公司内部网站有哪些,内网如何建网站?  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  简历在线制作网站免费,免费下载个人简历的网站是哪些?  在线制作视频网站免费,都有哪些好的动漫网站?  建站之星如何配置系统实现高效建站?  如何获取PHP WAP自助建站系统源码?  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  购物网站制作公司有哪些,哪个购物网站比较好?  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  表情包在线制作网站免费,表情包怎么弄?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  家具网站制作软件,家具厂怎么跑业务?  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  网站制作服务平台,有什么网站可以发布本地服务信息?  如何通过VPS建站实现广告与增值服务盈利?  如何快速生成可下载的建站源码工具?  手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  已有域名如何免费搭建网站?  建站上传速度慢?如何优化加速网站加载效率?  如何安全更换建站之星模板并保留数据?  高防服务器如何保障网站安全无虞?  MySQL查询结果复制到新表的方法(更新、插入)  交易网站制作流程,我想开通一个网站,注册一个交易网址,需要那些手续?  建站主机选虚拟主机还是云服务器更好?  代刷网站制作软件,别人代刷火车票靠谱吗?  nginx修改上传文件大小限制的方法  如何快速搭建高效WAP手机网站?  建站主机选购指南与交易推荐:核心配置解析  如何快速登录WAP自助建站平台?  如何自定义建站之星模板颜色并下载新样式?  如何快速建站并高效导出源代码?  矢量图网站制作软件,用千图网的一张矢量图做公司app首页,该网站并未说明版权等问题,这样做算不算侵权?应该如何解决?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  制作网站外包平台,自动化接单网站有哪些?  建站之家VIP精选网站模板与SEO优化教程整合指南  建站之星Pro快速搭建教程:模板选择与功能配置指南  上海网站制作网页,上海本地的生活网站有哪些?最好包括生活的各个方面的?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  盐城做公司网站,江苏电子版退休证办理流程?  如何通过FTP服务器快速搭建网站?  专业网站建设制作报价,网页设计制作要考什么证?  如何设计高效校园网站?  如何快速完成中国万网建站详细流程?  ,购物网站怎么盈利呢?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  专业网站制作服务公司,有哪些网站可以免费发布招聘信息?  教学论文网站制作软件有哪些,写论文用什么软件 ? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。