关于在Javascript中引用函数的问题

时间:2009-06-01 20:22:17

标签: javascript jquery function

问题:我有一个jQuery繁重的页面,它有一个内置的管理界面。 admin函数仅在设置admin变量时触发。这些功能需要第二个库才能正常工作,如果用户在首次创建页面时是管理员,则仅包含第二个文件。这些功能永远不会触发普通用户,普通用户也不会获得第二个库的包含。

引用当前包含的文件中的函数是不是很糟糕,即使该函数永远不能被调用? (这是否有意义:))

伪代码:

标题:(请注意,不包括admin.js)

<script type="text/javascript" src="script.js"></script>
<script type="text/javascript" src="user.js"></script>

script.js:(已引用但无法执行的管理员函数)

admin = false; // Assume this

$(".something").dblclick(function(){
 if(admin)
  adminstuff(); // Implemented in admin.js (not included)
 else
  userstuff();
});

思路: 我想可以使用两个单独的用户和管理员文件,但我觉得这将是一个过于复杂的解决方案(不想维护两个只有几行差异的大文件)。我在此文件中包含对admin函数的引用的唯一原因是我需要将它附加到作为脚本一部分刷新的页面元素。当jQuery刷新页面时,我需要将函数重新附加到交互元素。

问题: 我想保持简单的事情,如果用户不使用它,则不必包含我不需要的文件。这是一个很好的方法吗?或者我应该走另一条路?

7 个答案:

答案 0 :(得分:7)

代码应该无错误地运行,因为不会调用没有实现的管理功能。唯一真正被浪费的是传输未使用的管理代码的带宽。

但是,让我通过默默无闻来警告安全。如果用户要查看此代码并看到他们无法访问的管理员功能,他们可能会感到好奇并尝试下载“admin.js”文件并查看这些功能的作用。如果您阻止执行管理功能的唯一阻止是停止包含该文件,那么一些狡猾的用户可能会很快找到一种方法来调用管理功能,而这些功能应该无法执行。

如果您已对admin函数调用进行服务器端身份验证/权限检查,请忽略我之前的段落: - )

答案 1 :(得分:4)

就个人而言,我会在admin.js中绑定(或重新绑定)该事件:

$(function() {

$(".something").dblclick(function(){
  adminstuff();
});

});

function adminstuff()
{
  // ...
}

这样,“普通”用户就无法看到adminstuff()调用和函数。

答案 2 :(得分:3)

好问题。它不应该导致任何JavaScript问题。

需要考虑的其他事项:当您执行此操作时,您可能会将管理功能暴露给全世界,这可能对黑客有用。这可能不是什么大问题,但需要注意的是。

另见:

  

Why can I use a function before it’s defined in Javascript?

答案 3 :(得分:2)

我认为这不重要。如果它让你感觉更好,你可以创建一个空的存根函数。

答案 4 :(得分:1)

我认为在我看来,这并不是一个教条的答案。你正在做的是......有创意。如果你对此感到不舒服,这可能是考虑其他选择的一个标志。但是,如果你对那些不太满意,那么这可能是一个迹象,这是正确的事情(或者也许是最不对的事情)。最终你可以通过评论那条线来缓解混乱。我不会让自己对最佳实践抱有信仰。只是愿意坚持你的选择。无论如何,你已经向我证明了这一点。

答案 5 :(得分:1)

Javascript是动态的 - 它不应该关心函数是否未定义。

如果您将管理功能放在命名空间对象中(无论如何都是一个好习惯),您有几个选择。

  1. 检查管理对象中是否存在该功能
  2. 检查是否存在管理对象(可能替换您的标志)
  3. 改为使用操作对象,其中admin文件在加载时替换select函数。 (更好的是,使用原型继承来隐藏它们。)

答案 6 :(得分:1)

我认为你应该警惕你正在为大量的安全问题做好准备。在firebug中将admin等变量更改为“true”是非常简单的,并且看到admin.js可以公开访问,它不够简单,不能在页面上包含它,因为添加另一个脚本标记也很简单用firebug到页面。知识渊博的用户可以轻松地在这种情况下给自己管理权限。我认为你不应该依赖纯粹的客户端安全模型。