本系列作为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方法很难正确和可靠地被使用。在实际应用中,应该尽量避免使用它。
总结:
- ECMAScript标准并没有对函数的toString的实现方式作出规范。
- 因为toString在各种平台上存在着不一致的行为,尽量不要使用它。
本文深入探讨了JavaScript中函数toString方法的局限性与不可靠性,指出其实现方式未标准化,导致不同环境下的行为不一致;讨论了在函数使用bind方法时,返回的源代码可能包含不可读的native代码片段;并强调了传入参数无法在源代码中体现的问题。文章总结指出应避免依赖toString方法,以确保代码的稳定性和安全性。
633

被折叠的 条评论
为什么被折叠?



