在Google apps脚本文档中,有一个关于服务器端私有函数的页面。这应该可以解释,如果没有私有函数,服务器代码在用户浏览器中是可见的。 谁能解释一下如何在浏览器中看到此类服务器端功能? 谢谢
参见:https://developers.google.com/apps-script/guides/html/communication#private_functions
服务器代码在用户浏览器上永远不可见,只能看到函数名称。私有函数隐藏了这些名称,但更重要的是它们消除了前端直接调用它们的能力。
换句话说,私有函数允许您定义后端入口点,防止恶意用户绕过您可能拥有的某些检查并直接调用您的“内部”函数。
为了展示查看名称和调用任何非私有后端函数是多么容易,我举了这个示例来检查
google.script.run
对象:
function myFunction() {}
function anotherFunction() {}
function privateFunction_() {}
function doGet() {
return HtmlService.createHtmlOutput(
'<p id="output"></p>'+
"<script>var s = ''; for( var prop in google.script.run ) s+=prop+'<br>';"+
"document.getElementById('output').innerHTML = s;</script>"
);
}
这是发布的示例: https://script.google.com/macros/s/AKfycbzk0d03iB1O3vVYVD_U7eONM357iOPlAn7RFxAeZKx34q1Ones/exec
及其源代码(同上): https://script.google.com/d/1WMY5jWblGl8U84WvVU_mZjHDg-6rGOoOPnKMF6m2bS_V-2g6IChBVDrg/编辑
--解决评论中的问题
doGet
函数不能设为私有,因为它的名称是固定/预定义的。但这并不是真正的问题,因为无论如何这个函数都应该是一个入口点,并且因为您希望从用户的浏览器中调用它并且可以相应地进行参数检查等。
将 IIFE 与闭包结合使用
计数器.gs
const Counter = (function() {
const count = 0; // Private variable
function increment() {
count++; // Accessing the private variable
console.log('Count:', count);
}
function decrement() {
count--; // Accessing the private variable
console.log('Count:', count);
}
return {
increment,
decrement
};
})();
主.gs
Counter.increment(); // Output: Count: 1
Counter.increment(); // Output: Count: 2
Counter.decrement(); // Output: Count: 1
在上面的代码中,IIFE 用于创建一个封装了 count 变量和两个内部函数:increment 和 decrement 的闭包。 count 变量是私有的,只能由内部函数访问。
IIFE 立即执行,返回一个引用内部函数(递增和递减)的对象。由于闭包,这些函数可以访问私有计数变量。
类中的静态方法怎么样,它们的名称可以被用户看到并运行吗?