Javascript 笔记与总结(1-4)this
js 中函数的 4 种调用方式:
① 作为普通函数来调用,this 的值指向 window,准确地说,this 为 null,被解释成为 window。在 ECMAScript5 标准中,如果 this 为 null,则解释成 undefined
<script>
function t(){
this.x = 'hello';
}
t();
alert(window.x);
</script>
弹出:hello
② a.作为对象的方法来调用,this 指向方法的调用者,即该对象
<script>
var obj = {x:'hello',y:'world',t:function(){alert(this.x)}};
obj.t();
</script>
弹出:hello
b.
<script>
var obj = {x:'hello',y:'world',t:function(){alert(this.x)}}; var dog = {x:'wang'};
dog.t = obj.t;
dog.t();
</script>
弹出:wang
作为方法调用时,this 指向其调用那一刻的调用者,即母体对象,不管被调用函数,声明时属于方法还是函数
c.
<script>
var obj = {x:'hello',y:'world',t:function(){alert(this.x)}}; var dog = {x:'wang'};
dog.t = obj.t;
dog.t(); show = function(){
alert('show '+this.x);
}
dog.t = show;
dog.t();
</script>
d.
<script>
var obj = {x:'hello',y:'world',t:function(){alert(this.x)}}; var dog = {x:'wang'};
dog.t = obj.t;
dog.t(); show = function(){
alert('show '+this.x);
}
dog.t = show;
dog.t();
</script>
弹出:show wang
③ 作为构造函数调用时
js 中没有类的概念,创建对象使用构造函数来完成,或者直接用 json 格式{} 来写对象
<script>
function Dog(name,age){
this.name = name;
this.age = age;
this.bark = function(){
alert(this.name);
}
}
var dog = new Dog('妞妞',2);
dog.bark();
</script>
弹出:妞妞
new Dog 发生了一下几个步骤:
a. 系统创建空对象{},(空对象 construct 属性指向 Dog 函数)
b. 把函数的 this 指向该空对象
c. 执行该函数
d. 返回该对象
例:
<script>
function Robit(){
this.name = '瓦力';
return 'wali';
}
var robit = new Robit();
console.log(robit);
</script>
这段代码将输出?
答案:
Robit {name: "瓦力"}
输出的是 Robit 对象,因为函数作为构造函数运行时,return 的值是忽略的,依然返回对象(return 无意义)。
④ 函数通过 call,apply 调用
语法格式:函数.call(对象,参数1,参数2...参数n);
<script>
function t(num){
alert('我的年龄是 '+this.age);
alert('虽然我看起来像 '+(this.age+num));
}
var human = {name:'迭戈.科斯塔',age:27};
human.t = t;
human.t(10);
</script>
弹出:我的年龄是 27
弹出:虽然我看起来像 28
接下来,不把 t 赋为 human 的属性,也能把 this 指向 human
<script>
function t(num){
alert('我的年龄是 '+this.age);
alert('虽然我看起来像 '+(this.age+num));
} var giroud = {name:'Giroud',age:28};
t.call(giroud,-5);
</script>
弹出:我的年龄是 28
弹出:虽然我看起来像 23
【分析】:
fn.call(对象,参数1,参数2...参数n);
运行如下:
a. fn 函数中的 this 指向对象 obj
b. 运行 fn(参数1,参数2...参数n)
Javascript 笔记与总结(1-4)this的更多相关文章
- [Effective JavaScript 笔记] 第4条:原始类型优于封闭对象
js有5种原始值类型:布尔值.数字.字符串.null和undefined. 用typeof检测一下: typeof true; //"boolean" typeof 2; //&q ...
- [Effective JavaScript 笔记] 第5条:避免对混合类型使用==运算符
“1.0e0”=={valueOf:function(){return true;}} 是值是多少? 这两个完全不同的值使用==运算符是相等的.为什么呢?请看<[Effective JavaSc ...
- [Effective JavaScript 笔记]第3章:使用函数--个人总结
前言 这一章把平时会用到,但不会深究的知识点,分开细化地讲解了.里面很多内容在高3等基础内容里,也有很多讲到.但由于本身书籍的篇幅较大,很容易忽视对应的小知识点.这章里的许多小提示都很有帮助,特别是在 ...
- [Effective JavaScript 笔记]第27条:使用闭包而不是字符串来封装代码
函数是一种将代码作为数据结构存储的便利方式,代码之后可以被执行.这使得富有表现力的高阶函数抽象如map和forEach成为可能.它也是js异步I/O方法的核心.与此同时,也可以将代码表示为字符串的形式 ...
- [Effective JavaScript 笔记]第28条:不要信赖函数对象的toString方法
js函数有一个非凡的特性,即将其源代码重现为字符串的能力. (function(x){ return x+1 }).toString();//"function (x){ return x+ ...
- 从头开始学JavaScript 笔记(一)——基础中的基础
原文:从头开始学JavaScript 笔记(一)--基础中的基础 概要:javascript的组成. 各个组成部分的作用 . 一.javascript的组成 javascript ECMASc ...
- 【原】javascript笔记之Array方法forEach&map&filter&some&every&reduce&reduceRight
做前端有多年了,看过不少技术文章,学了新的技术,但更新迭代快的大前端,庞大的知识库,很多学过就忘记了,特别在项目紧急的条件下,哪怕心中隐隐约约有学过一个方法,但会下意识的使用旧的方法去解决,多年前ES ...
- JavaScript笔记目录
JavaScript笔记目录 一.JavaScript简介 二.在HTML中使用JavaScript ...持续更新中,敬请期待
- 蛋糕仙人的javascript笔记
蛋糕仙人的javascript笔记:https://www.w3cschool.cn/kesyi/kesyi-nqej24rv.html
- JavaScript笔记(第一章,第二章)
JavaScript笔记(第一章,第二章) 第一章: <meta http-equiv="Content-Type" content="text/html; cha ...
随机推荐
- 局域网通过ip查mac地址、通过mac地址查ip方法
sh-4.1# which arp #linux主机A /sbin/arp sh-4.1# arp -a 192.168.1.10 #主机B的IP bogon (:8t:8p::: [ether] o ...
- js实现快速排序(in-place)简述
快速排序,又称划分交换排序.以分治法为策略实现的快速排序算法. 本文主要要谈的是利用javascript实现in-place思想的快速排序 分治法: 在计算机科学中,分治法是建基于多项分支递归的一种很 ...
- Python 中的函数与类的方法
注:本文转译自 Stackoverflow 上 Adding a Method to an Existing Object 的最佳回答. 在 python 中,def 定义的函数与类中的方法有很大的不 ...
- Linux常用命令_(文件权限)
Linux权限管理: 二.权限管理1.3种基本权限在Linux中,将使用系统资源的人员分为4类:超级用户.文件或目录的属主.属主的同组人和其他人员.超级用户拥有对Linux系统一切操作权限,对 于其他 ...
- Xamarin iOS编写第一个应用程序创建工程
Xamarin iOS编写第一个应用程序创建工程 在Xcode以及Xamarin安装好后,就可以在Xamarin Studio中编写程序了.本节将主要讲解在Xamarin Studio中如何进行工程的 ...
- D6 I
I - I Time Limit:1000MS Memory Limit:2048KB 64bit IO Format:%lld & %llu Submit Status Pr ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- C# 同步/并发队列ConcurrentQueue
如下所示,ConcurrentQueue做到了代码的简化,在并发模型中充当同步对象 private ConcurrentQueue<string> inQueue = new Concur ...
- BZOJ2584 : [Wc2012]memory
xy方向分开考虑 用扫描线处理出拓扑序,第二问直接回答拓扑序, 第一问: 将操作倒过来,变成加入线段,用线段树维护区间拓扑序的最值 #include<cstdio> #include< ...
- 生产环境下一定要开启mysqlbinlog
在没有备份数据库的情况下,可以用binlog进行恢复 在生产环境下安全第一,损失一点点效率换来的安全还是值得的. http://www.cnblogs.com/zc22/archive/2013/06 ...