js之this的用法

this是Javascript语言的一个关键字。
它代表函数运行时,自动生成的一个内部对象,只能在函数内部使用。比如,

function test(){
this.x = 1;
}

随着函数使用场合的不同,this的值会发生变化。但是有一个总的原则,那就是this指的是,调用函数的那个对象。

下面分四种情况,详细讨论this的用法。

情况一 纯粹的函数调用

这是函数的最通常用法,属于全局性调用,因此this就代表全局对象Global。
请看下面这段代码,它的运行结果是1。

function test(){
this.x = 1;
alert(this.x);
}
test(); // 1

为了证明this就是全局对象,我对代码做一些改变:

var x = 1;
function test(){
alert(this.x);
}
test(); // 1

运行结果还是1。再变一下:

var x = 1;
function test(){
this.x = 0;
}
test();
alert(x); //0

情况二 作为对象方法的调用

函数还可以作为某个对象的方法调用,这时this就指这个上级对象。

function test(){
alert(this.x);
}
var o = {};
o.x = 1;
o.m = test;
o.m(); // 1

情况三 作为构造函数调用

所谓构造函数,就是通过这个函数生成一个新对象(object)。这时,this就指这个新对象。

function test(){
this.x = 1;
}
var o = new test();
alert(o.x); // 1

运行结果为1。为了表明这时this不是全局对象,我对代码做一些改变:

var x = 2;
function test(){
this.x = 1;
}
var o = new test();
alert(x); //2

运行结果为2,表明全局变量x的值根本没变。

情况四 apply调用

apply()是函数对象的一个方法,它的作用是改变函数的调用对象,它的第一个参数就表示改变后的调用这个函数的对象。因此,this指的就是这第一个参数。

var x = 0;
function test(){
alert(this.x);
}
var o={};
o.x = 1;
o.m = test;
o.m.apply(); //0

apply()的参数为空时,默认调用全局对象。因此,这时的运行结果为0,证明this指的是全局对象。
如果把最后一行代码修改为

o.m.apply(o); //1

运行结果就变成了1,证明了这时this代表的是对象o。


1
May 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

urlencode与rawurlencode

urlencode 除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,但是空格则编码为加号(+)。
rawurlencode  除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。

在使用中还有些细微的区别,下面看一段代码:

<?php
$query1 = 'foo=bar&php=hypertext+processor';
$query2 = 'foo=bar&php=hypertext processor';

echo 'query1 : '.$query1, '<br>';
echo 'query2 : '.$query2, '<br><br>';

echo 'urlencode : '.urlencode($query1), '<br>';
echo 'urlencode : '.urlencode($query2), '<br><br>';

echo 'rawurlencode : '.rawurlencode($query1), '<br>';
echo 'rawurlencode : '.rawurlencode($query2), '<br><br>';

上面的代码将会输出如下的内容:

query1 : foo=bar&php=hypertext+processor
query2 : foo=bar&php=hypertext processor

urlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
urlencode : foo%3Dbar%26php%3Dhypertext+processor

rawurlencode : foo%3Dbar%26php%3Dhypertext%2Bprocessor
rawurlencode : foo%3Dbar%26php%3Dhypertext%20processor

可见,urlencode 把空格转为了 + ,rawurlencode 却是把空格转为了 %20 , 这里看出 urlencode 把空格做了特殊处理

再进行一个测试,把如下参数加在 url 后面 a=foo%3Dbar%26php%3Dhypertext%2Bprocessor  ,这个字符串就是上面的query1 经过 urlencode 之后的结果,接着加入如下测试代码,看看情况:

<?php
echo '$_GET[a] : '.$_GET['a'], '<br>';
echo 'urldecode : '.urldecode($_GET['a']), '<br>';
echo 'rawurldecode : '.rawurldecode($_GET['a']), '<br>';
?>

上面的代码将会输出如下的内容:

$_GET[a] : foo=bar&php=hypertext+processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext+processor

可见,浏览器自动直接对参数进行了 decode 操作。如果我们按照常理在刚开始进行了 encode 编码,后面肯定是需要 decode 解码,但是如果在这时候解码,你会发现使用 urldecode 与 rawurldecode 的结果是不同的。

接着把 query2 经过urlencode 的结果放到 url 的参数中测试,a=foo%3Dbar%26php%3Dhypertext+processor ,结果如下:

$_GET[a] : foo=bar&php=hypertext processor
urldecode : foo=bar&php=hypertext processor
rawurldecode : foo=bar&php=hypertext processor

可见,浏览器自动进行了 decode 解码操作,并且是 urldecode ,而不是 rawurldecode 。为什么呢?因为 rawurldecode 是不会把 + 转换为空格的。

然后分别把query1 query2  经过rawurlencode 的结果放到url 参数中测试,发现结果都是在我们的预料之中。

总结,(1)如果要把一些特殊字符放到浏览器的 url 参数中,需要使用 encode 方式来编码,否则取到的值有可能不是你所想要的,到底用哪一个,这个看情况而定吧,一般建议使用 rawurlencode ;通过浏览器访问这些经过编码处理的 url 地址时,在接受这些参数值的时候是不需要 decode 操作的。(2)如果情况出现在与浏览器无关的场合,则需要把encode /decode 成对使用。切记,encode 的时候不要对整个参数列表做 encode,而是只对参数值进行 encode 即可。

7
Mar 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

PHP函数的实现原理及性能分析

前言 

在任何语言中,函数都是最基本的组成单元。对于php的函数,它具有哪些特点?函数调用是怎么实现的?php函数的性能如何,有什么使用建议?本文将从原理出发进行分析结合实际的性能测试尝试对这些问题进行回答,在了解实现的同时更好的编写php程序。同时也会对一些常见的php函数进行介绍。

阅读剩余部分...

22
Feb 2013
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

如何成为强大的程序员?

Aaron Stannard是新创公司MarkedUp的CEO,他最近花费大量时间雇佣、评估很多不同的程序员,并和他们一起协作。在这个过程中他发现并总结了十种程序员无法意识到自己潜力的原因,意在让更多程序员发掘出自己的潜力,从而成为强大的程序员。

阅读剩余部分...

19
Feb 2013
AUTHOR WiFeng
CATEGORY Jotting
COMMENTS No Comments

数组赋值在不同语言中的差异

不同的编程语言,基本语法一致,但由于各自的设计结构及使用范围不同而导致一些细微的语法差异。以下介绍一个数组在赋值的时候结果不同的例子。

阅读剩余部分...

14
Dec 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

两个“小米”,两个“苹果”

随着移动互联网慢慢成长,手机可以做的事情越来越多,日常的生活中玩手机的时间占据了好大一部分。如此看来,选择一部绝佳的手机是迫在眉睫,势不可挡。iphone 、小米等等都是不错的选择。以下介绍本人对于选择、购买手机的一些心得体会,愿与大家分享。

阅读剩余部分...

2
Dec 2012
AUTHOR WiFeng
CATEGORY Jotting
COMMENTS No Comments

(PHP版)处理图片的类库

GD库,很强大,不过对其使用非常熟练的为数不多,对于处理 jpg 之类的图片好像没有任何问题,但是出现了gif 动画图片怎么办?对于裁减 gif 动画图片,本人至今在GD库中没有找到一个合适且完美的解决方案。

阅读剩余部分...

17
Nov 2012
AUTHOR WiFeng
CATEGORY Web
COMMENTS No Comments

程序员如何保持优秀

本文作者:外刊IT评论网 | 原文地址:程序员如何保持优秀


1、小范围的选择一些有用技术,透彻的学习它们,拥抱它们。然后不断的扩展这个范围。

2、理解各种数据结构的优点和缺点,包括它们在内存中和在硬盘上的各自表现。

3、理解各种算法的优点和缺点。

4、了解你的工作领域。关上电脑,去做你的用户们在做的事。

5、有准备,有愿望,有能力在任何时候投入到多种技术层面中。你必须知道表象下的技术原理。在“各个技术层面的掌握程度”和“编程能力”上有着密切的联系。

6、发挥你的想象力。永远都要问,“有更好的方法吗?”跳出常规思维约束。最好的解决方案也许还没有被发现。

7、优秀程序员:我优化代码。更优秀程序员:我设计数据。最优秀程序员:他们的不同之处是什么?

8、正确的构造你的数据。任何的缺陷都将造成你的代码里无尽的技术债务。

9、正确的命名事物。使用“动词-形容词-名词”格式来命名程序和函数。变量名要足够长,尽量短,有意义。如果其他程序员不能够理解你的代码,说明你写的不够清楚。在大多数情况下,针对下一个程序员而编码要比针对环境而编码重要的多。

10、把分析和编程分离开做。它们不是同类的事物,需要不同类型的劳力资源,需要在完全不同的时间和地点分开做。如果同时做它们,你一样都做不好。(我喜欢在一天的末尾做不涉及技术的分析,而在第二天早上进行编程。)

11、永远不要图省事走近道。永远不要把相同的代码部署两次。永远不要把一个变量命名成另一个变量名的一部分。也许你不明白这些规则,也许你要辩解。但如果你是遵守着这样做的,这些规则就会约束你正确的构造你的程序。图省事的做法是让那些低等级的程序员永远停留在低等级的原因。

12、学习如何测评程序性能。你会惊奇的发现从中能学到很多之外的知识。

13、学会区别对待问题细节和问题后果。问题细节不会导致太大的差别,而问题后果能导致世界灭亡。只关注后果。

14、密切关注你的用户/客户/管理人员。帮助他们认清楚他们的“what”,这比帮助他们明白他们的“how”要重要的多。

15、写一个框架,不论你是否打算用它。你将从中学到从其它途径中学不到的东西。

16、把你知道的东西教给他人——通过口口交流或通过写作。最终这将成为教育自己的机会。

17、永远要对你的客户/用户说“Yes”,即使在你不确定的情况下。90%的情况下,你会最终找到方法实现它。10%的机会,你将会去向他们道歉。这是重要的个人成长中付出的一点小代价。

18、寻找别人的做出神奇的事情但却一滩糊涂的代码。重构它。然后丢掉它,并发誓自己永远不要犯他们犯下的相同错误。(这样的程序你会发现很多。)

19、数据永远 > 理论或观点。通过开发东西来学习数据。

20、有可能的话,开创自己的业务(服务或产品)。你将从中学到很多你做雇员永远学不到的关于编程的知识。


31
Oct 2012
AUTHOR WiFeng
CATEGORY Jotting
COMMENTS No Comments

安装rzsz软件包全攻略

首先,简单说明rzsz的大意,rz是linux系统上的文件上传工具,sz是linux系统上的文件下载工具。有的linux系统预装这两个软件,则不必要再次安装,有的系统则需要自己去安装后方可使用。以下介绍 rzsz 的安装方法:

阅读剩余部分...

14
Oct 2012
AUTHOR WiFeng
CATEGORY Web,Asset
COMMENTS No Comments

Android SDK源码

android 2.3.3及之前版本的SDK下载地址如下:
http://rgruet.free.fr/public/

新版本暂未找到合理的下载源,期待。。。

10
Oct 2012
AUTHOR WiFeng
CATEGORY Mobile
COMMENTS 1 Comment