首页 > 编程语言 > 详细

Effective JavaScript Item 28 不要依赖函数的toString方法

时间:2014-09-25 10:07:49      阅读:330      评论:0      收藏:0      [点我收藏+]

本系列作为Effective JavaScript的读书笔记。

 

JavaScript中,函数对象上存在一个toString方法,它能够方便地将函数的源代码转换返回成一个字符串对象。


(function(x) {
	return x + 1;
}).toString(); // "function (x) {\n return x + 1;\n}"

toString方法不仅仅会让一些黑客找到攻击的方法,而且该方法也存在严重的限制。

 

首先,toString方法的实现方式并没有被ECMAScript规范化,因此各种JavaScript的执行引擎中的toString的实现方式也许会不一致。

 

其次,当toString能够返回函数源代码并且函数本身完全以JavaScript实现时,源代码才会被正确的返回。比如,在以下的函数调用了,使用了bind方法得到了一个新的函数对象(关于bind的使用方式,可以参考Item 25, 26)


(function(x) {
	return x + 1;
}).bind(16).toString(); // "function (x) {\n [native code]\n}"

可以发现,返回的字符串中有一段是[nativecode],这是因为在很多JavaScript执行环境中,bind方法都是使用其他编程语言如C++来实现的。因此这里看到native code实际上就是代表着一段编译后的C++源码。

 

最后,toString方法返回的源代码体现不了传入参数的值:


(function(x) {
	return function(y) {
		return x + y;
	}
})(42).toString(); // "function (y) {\n return x + y;\n}"

上述代码中传入的参数42在返回的函数源代码中并没有被体现出来。

 

因为以上的这些限制,使toString方法很难正确和可靠地被使用。在实际应用中,应该尽量避免使用它。

 

总结:

  1. ECMAScript标准并没有对函数的toString的实现方式作出规范。
  2. 因为toString在各种平台上存在着不一致的行为,尽量不要使用它。

Effective JavaScript Item 28 不要依赖函数的toString方法

原文:http://blog.csdn.net/dm_vincent/article/details/39546447

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!