如何在Javascript对象中正确定义(函数||函数)?

Cub*_*oft 1 javascript

这有效:

<div id="result"></div>

<script type="text/javascript">
var Base64Encode = window.btoa || CryptoJS.enc.Base64.stringify;

document.getElementById('result').innerHTML = Base64Encode("Please work.");
</script>
Run Code Online (Sandbox Code Playgroud)

但是,这个:

<div id="result"></div>

<script type="text/javascript">
var Test = {
    Base64Encode: window.btoa || CryptoJS.enc.Base64.stringify
};

document.getElementById('result').innerHTML = Test.Base64Encode("Please work.");
</script>
Run Code Online (Sandbox Code Playgroud)

生成一个错误"TypeError:'btoa'调用一个没有实现接口Window的对象."

小提琴:

http://jsfiddle.net/kAGU2/

为什么第一个示例有效但第二个示例发出错误?修复此特定错误的正确方法是什么?

Ber*_*rgi 5

为什么第一个示例有效但第二个示例发出错误?

当函数被调用为时Base64Encode(),this上下文被隐式设置为window.但是,当你把它作为方法打开时Test.Base64Encode(),this会参考Testbtoagrumps.

修复此特定错误的正确方法是什么?

您需要绑定到预期的上下文:

Base64Encode = window.btoa
  ? window.btoa.bind(window)
  : CryptoJS.enc.Base64.stringify;
Run Code Online (Sandbox Code Playgroud)