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 ...
随机推荐
- linux常见问题集锦
本文转自 http://bbs.chinaunix.net/thread-3668921-1-1.html,在此感谢作者分享 一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. ...
- Man简单介绍
转自:http://os.51cto.com/art/201312/425525.htm Linux系统提供了相对比较丰富的帮助手册(man),man是manual的缩写,在日常linux系统管理中经 ...
- hdu 5312 数学
- Struts2 Convention插件的使用
转自:http://chenjumin.iteye.com/blog/668389 1.常量说明 struts.convention.result.path="/WEB-INF/conten ...
- Android ActionBar 一步一步分析 (转)
原文摘自:http://blog.csdn.net/android2me/article/details/8874846 1.Action Bar 介绍 我们能在应用中看见的actionbar一般就是 ...
- Fragments碎片
A Fragment represents a behavior or a portion of user interface in an Activity. 在一个Activity活动中,一个Fra ...
- 自定义ContentProvider的一些细节探究
1. 适用范围 对于什么情况下才会用到自定义的ContentProvider,官方文档的Dev Guide是这样描述的: 如果你想要提供以下的一种或几种特性的时候你才需要构造一个ContentPr ...
- libyuv 编译 for android
libyuv is an open source project that includes is an instrumentation framework for building dynamic ...
- http://jingyan.baidu.com/article/bad08e1ee14ae409c85121cf.html
http://jingyan.baidu.com/article/bad08e1ee14ae409c85121cf.html
- 排列组合[HDU1521]
排列组合 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...