this在函数调用时创建,一般的对象没有this,全局window可以理解为一个函数,他有一个全局this

JavaScript 语言之所以有this的设计,跟内存里面的数据结构有关系。

函数里this的指向由函数的调用方式决定

不服就干,几个例子来说明函数的调用方式

var 变量 = 123
var 对象 = {
变量: 456,
函数: function () {
var 变量 = 789
console.log(this.变量)
}
};
(对象.函数)();
//==>对象.函数()
(对象.函数 = 对象.函数)();
//var ret = (对象.函数 = 对象.函数);//执行括号里的赋值操作
//ret()
(对象.函数, 对象.函数)()
//var ret = (对象.函数, 对象.函数);返回最后一个
//ret()
function a(xx) {
this.x = xx;
return this
};
var x = a(5);//此时x 是window
var y = a(6);//此时x 是6
console.log(x.x);//x是6 6.6 undefine
console.log(y.x);//window.x是6
var 对象 = {
函数一:function(){
function 函数二(){
console.log(this)
}
return 函数二()
}
}
对象.函数一()//this是window,函数二虽然在函数一里面调用,但函数二前面没前缀,或者看做window.函数二(),所以函数二里的this就是window
var num = 20;
var obj = {
num:30,
fn:(function (num) {
this.num *= 3;
num += 15;
var num = 45;
return function () {
this.num *= 4;
num += 20;
console.log(num);
}
})(num)
}
var fn = obj.fn;
fn();//65
obj.fn();//85
console.log(window.num,obj.num);//240,120
var o = {
f: function () {
console.log(this);
},
2: function () {
console.log(this);
}
};
o.f(); //o
o[2]();//o !!!!!!!!!!这种和上一个等价
var length = 10;

function fn() {
console.log(this.length);
}
var obj = {
length: 5,
method: function (f) {
f(); //10
arguments[0](); //1 (arguments是一个伪数组对象,他的第一个参数是fn函数,他调用fn函数,所以this指的是arguments)
arguments[0].call(this); //5(改变fn的指向,这里的this是obj)
}
};
obj.method(fn);

箭头函数的this

箭头函数没有this,他的this是外层的this,外层的this一旦确定,这时候不管谁调用箭头函数,他的this都是原来确定的外层this,但是如果再改变外层的this,箭头函数的this跟着改变,

call,apply,bind方法指定this

函数.call(任意,函数参数,...)//call改变this会立即执行函数,第一个参数的类型不同改变的this指向也不同,如果是对象this就指向该对象,如果是字面量就转换成相应的对象this指向这个this,如果是null和undefined就是window
函数.apply(任意,[函数参数,...])
函数.bind(任意)//绑定后不会立即执行,啥时候再调用函数,函数里的this就是现在绑定的,==注意this只能改变一次==

this大全,还有谁??????!!!!!!!的更多相关文章

  1. Oracle 数据库语句大全

    Oracle数据库语句大全 ORACLE支持五种类型的完整性约束 NOT NULL (非空)--防止NULL值进入指定的列,在单列基础上定义,默认情况下,ORACLE允许在任何列中有NULL值. CH ...

  2. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  3. .NET Core dotnet 命令大全

    dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...

  4. Python 资源大全中文版

    Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列的资源整理.awesome-python 是 vinta 发起维护的 Python 资源列 ...

  5. 【JS】javascript 正则表达式 大全 总结

    javascript 正则表达式 大全 总结 参考整理了一些javascript正则表达式 目的一:自我复习归纳总结 目的二:共享方便大家搜索 微信:wixf150 验证数字:^[0-9]*$ 验证n ...

  6. TextView使用大全

    最近打算写一个系列的android初级开发教程,预计40篇以上的文章,结合我实际工作中的经验,写一些工作中经常用到的技术,让初学者可以少走弯路,写一个系列的话,大家学习起来也有头有尾. 今天就从我们每 ...

  7. [WinForm]WinForm跨线程UI操作常用控件类大全

    前言 在C#开发的WinForm窗体程序开发的时候,经常会使用多线程处理一些比较耗时之类的操作.不过会有一个问题:就是涉及到跨线程操作UI元素. 相信才开始接触的人一定会遇上这个问题. 为了解决这个问 ...

  8. iOS中NSLog输出格式大全

    iOS开发中的输出格式大全: %@                   对象 %d, %i               整数%u                    无符整形%f           ...

  9. 织梦dedecms漏洞修复大全(5.7起)

    很多人说dedecms不好,因为用的人多了,找漏洞的人也多了,那么如果我们能修复的话,这些都不是问题. 好,我们来一个一个修复.修复方法都是下载目录下该文件,然后替换或添加部分代码,保存后上传覆盖(记 ...

  10. [No00009B]win10快捷键大全

    微软为Win10命令行(Command Prompt)加入了Ctrl + V的支持 Win10新增功能快捷键大全: 贴靠窗口:Win + 左/右 >  Win + 上/下 > 窗口可以变为 ...

随机推荐

  1. 从ReentrantLock加锁解锁角度分析AQS

    本文用于记录在学习AQS时,以ReentrantLock为切入点,深入源码分析ReentrantLock的加锁和解锁过程. 同步器AQS的主要使用方式是继承,子类通过继承同步器并实现它的抽象方法来管理 ...

  2. 漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃monkey日志

    漫谈:从APP崩溃率标准,到Monkey介绍拓展Maxim,及Jenkins自动化配置,持续集成获取崩溃日志 1.APP崩溃率标准 开发或测试app的同学,对于app崩溃肯定非常熟悉,频繁的线上崩溃属 ...

  3. Java 解决Enum.valueOf找不到枚举出现的异常

    由于Enum.valueOf匹配不到枚举时会出现异常,这个可以用try...catch来解决,但是这样会导致代码往臃肿的道路上越走越远. 本文与其说是解决Enum.valueOf找不到枚举出现的异常还 ...

  4. CentOS7下一键小白搭建seafile pro云盘

    搭建前准备工作 vps或者云服务器,个人搭建使用建议腾讯云,公司搭建使用建议阿里云. 没有服务器的小伙伴可以下面链接进入看下,腾讯云的配置带宽会比阿里云的好点. 阿里云新人优惠服务器 腾讯云云上特惠 ...

  5. String字符串加号的作用与基本数据类型加号的作用的区别

    1 public static void main(String args[] ){ 2 String Str="hellow"; 3 int num=110; 4 char c= ...

  6. !!vue-style-loader!css-loader?

    摘自:https://blog.csdn.net/qq_27721169/article/details/88666340 问题描述*!!vue-style-loader!css-loader?{&q ...

  7. 写博客真的很枯燥,更麻烦的是我还不会MD,排版太不友好了啊。

    学习MD 第一标题 #一号标题 ##二号标题 神马啊,博客园居然不支持MD语法

  8. post和get、PostMapping、GetMapping和RequestMapping

    PostMapping.GetMapping和RequestMapping PostMapping和GetMapping封装了method="",限制了method,更加规范化. ...

  9. NO.A.0001——FIO工具使用教程

    一.FIO工具安装: 1.FIO地址: 官网地址:http://freecode.com/projects/fio/ 源码安装包:http://brick.kernel.dk/snaps/fio-2. ...

  10. 定位一个网络问题引起的ceph异常

    前言 有一个ceph环境出现了异常,状态就是恢复异常的慢,但是所有数据又都在走,只是非常的慢,本篇将记录探测出问题的过程,以便以后处理类似的问题有个思路 处理过程 问题的现象是恢复的很慢,但是除此以外 ...