js中的this关键字,setTimeout(),setInterval()的执行过程

var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: test1.showname
}
test2.showname()

运算结果是windseek2,由于test2.showname=test1.showname所以test2.showname()=test1.showname();

test2.showname=

function () {

console.log(this.name);

}

test2.showname();对象时test2,所以this也指向test2 name自然也是test2.name windseek2

上面的代码也相当于这样写:

var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
console.log(this.name);
}
}
test2.showname()

运算结果是一样的

var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
test1.showname();
}
}
test2.showname()

这时的运算结果应该是windseek1,由于test2.showname()执行其实是找到,test1.showname()执行,对象时test1,this指向test1,结果也就是test1.name也就是windseek1

var name="windseek";
var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
var test=test1.showname;
test();
}
}
test2.showname();

结果是windseek,因为test2.showname()执行时会找到test()执行,test=function () {console.log(this.name);},test前面没有任何对象,作用域就是全局的,this就是全局变量,this.name也就是windseek

上述代码可以解释成以下代码

var name="windseek";
var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
var test=function () {
console.log(this.name);
};
test();
}
}
( function () {
var test=function () {
console.log(this.name);
};
test();
})();

写到这,感觉写代码像是在做数学题了,越来越有意思了

var name='windseek';
var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
setTimeout(test1.showname,1000);
}
}
test2.showname();

结果就是windseek其实,setTimeout等价于这种函数function(__callback){ __callback();} 最后执行的是callback

等价于这样写

var name='windseek';
var test1 = {
name: 'windseek1',
showname: function () {
console.log(this.name);
}
}
var test2 = {

name:'windseek2',
showname: function () {
(function(__callback){
    __callback();
})(test1.showname);
}
}
test2.showname();

结果一样也是windseek,但是这个不会延迟,settimeout会延迟,setInterval也是一样的原理

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏流媒体

C语言结构体对齐

804
来自专栏性能与架构

格式化SQL来提高效率

对SQL语句进行格式化不会让其运行得更快,但对我们的工作效率是有很大好处的 (1)提高SQL的可读性大大提高,便于维护 (2)提高开发效率,方便测试 例如 ? ...

3179
来自专栏Python小屋

Python中的偏函数和函数柯里化

偏函数(partial)和函数柯里化(currying)是函数式编程中常用的技术。有时候我们在复用已有函数时可能需要固定其中的部分参数,这除了可以通过默认值参数...

2594
来自专栏程序员互动联盟

【答疑释惑第四十讲】前端工程师和程序猿有什么区别?

疑惑一 int *p,sizeof(p) 输出多少? ? 对于这个问题,我们知道,指针的大小和指针的类型相关,那么int 型指针的长度其实就是整形的长度。那...

3288
来自专栏Aloys的开发之路

不引入新的数组,实现数组元素交换位置函数

         最近遇到一道C++的面试题,要求不引入新的数组,实现数组元素交换位置函数,看似挺简单的,却还是花费了我不少时间,这里记录下来,给大家一个简单的...

1938
来自专栏前端菜鸟变老鸟

Object.keys和Object.values

使用Object.keys()或者Object.values()获取循环变量,渲染的时候根据循环变量获取值。Object.keys()函数返回索引(不仅仅是数字...

662
来自专栏Python小屋

Python按位异或运算符^应用案例一则:查找只出现一次的数字

问题描述:有一个整数列表,里面有一个数字只出现了一次,而其他数字都出现了4次,要求查找这个只出现了一次的数字。 思路要点:一个数字和自己异或一次会变成0。 参考...

2543
来自专栏自动化测试实战

接口测试基础——第7篇 简单的Python知识普及

2813
来自专栏达摩兵的技术空间

单词片段分割–0328代码练习

首先不要公式绝对的误导,其前面的数值加起来其实就是字符串的总长度,而后面的4是指不间隔的片段计数,而不间隔,突然想到之前学到的数组的reduce方法不就是可以拿...

642
来自专栏GreenLeaves

C#核编之系统数据类型和相应的C#关键字

和任何编程语言一样,C#定义了一组用于表示局部变量、成员变量、返回值以及输入参数的基本数据类型。然而,与其他编程语言不同的是,这些关键字不只是编译器能识别的标记...

1838

扫码关注云+社区