This action will force synchronization from 老胡来也/JavaScript课程, which will overwrite any changes that you have made since you forked the repository, and can not be recovered!!!
Synchronous operation will process in the background and will refresh the page when finishing processing. Please be patient.
'use strict'//方法//在一个对象中绑定函数,称为这个对象的方法。/*在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()绑定到对象上的函数称为方法,和普通函数也没啥区别,但是它在内部使用了一个this关键字,这个东东是什么?在一个方法内部,this是一个特殊变量,它始终指向当前对象,也就是xiaoming这个变量。所以,this.birth可以拿到xiaoming的birth属性。*/// function getAge() {// var y = new Date().getFullYear();// return y - this.birth;// }// var xiaoming = {// name: '小明',// birth: 1990,// age: getAge// };// console.log(xiaoming.age()); // 29, 正常结果// getAge(); // NaN/*上面定义的对象的方法拆开写是这样的:function getAge() {var y = new Date().getFullYear();return y - this.birth;}var xiaoming = {name: '小明',birth: 1990,age: getAge};xiaoming.age(); // 25, 正常结果getAge(); // NaN嗯?这是为什么??注意,这里是JavaScript的一处大坑!!!===============================================================================================================================JavaScript的函数内部如果调用了this,那么这个this到底指向谁?答案是,视情况而定!如果以对象的方法形式调用,比如xiaoming.age(),该函数的this指向被调用的对象,也就是xiaoming,这是符合我们预期的。如果单独调用函数,比如getAge(),此时,该函数的this指向全局对象,也就是window。这不坑爹么!然鹅,更坑爹的是,如果这么写:var fn = xiaoming.age; // 先拿到xiaoming的age函数fn(); // NaN也是不行的!要保证this指向正确,必须用obj.xxx()的形式调用!*/// var xiaoming = {// name: '小明',// birth: 1990,// age: function () {// var y = new Date().getFullYear();// return y - this.birth;// }// };// console.log(xiaoming.age());// var fn = xiaoming.age;// fn(); // Uncaught TypeError: Cannot read property 'birth' of undefined/*这是一个巨大的设计错误,要想纠正可没那么简单。ECMA决定,在strict模式下让函数的this指向undefined,因此,在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; // 在方法内部一开始就捕获thisfunction getAgeFromBirth() {var y = new Date().getFullYear();return y - that.birth; // 用that而不是this}return getAgeFromBirth();}};xiaoming.age(); // 25用var that = this;,你就可以放心地在方法内部定义其他函数,而不是把所有语句都堆到一个方法中。*/// applyfunction getAge() {var y = new Date().getFullYear();return y - this.birth;}var xiaoming = {name: '小明',birth: 1990,age: getAge};console.log(xiaoming.age()); // 29getAge.apply(xiaoming, []); // 29, this指向xiaoming, 参数为空/*虽然在一个独立的函数调用中,根据是否是strict模式,this指向undefined或window,不过,我们还是可以控制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(); // 25getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空另一个与apply()类似的方法是call(),唯一区别是:apply()把参数打包成Array再传入;call()把参数按顺序传入。比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:Math.max.apply(null, [3, 5, 4]); // 5Math.max.call(null, 3, 5, 4); // 5对普通函数调用,我们通常把this绑定为null。*/
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。