JavaScript和作用域

分享于 

6分钟阅读

Web开发

  繁體 雙語

介绍

嗯,我已经过了一段时间了,它归结为假日。 没有什么比假日更让你whack的了。 如果你跟我一样,那么你可以尽可以能地保持你的生活,这是你能够工作的唯一原因。 这让我想到了这个博客帖子并给了我一个想法。

我已经准备了一些关于MVC的文章,甚至是演示。 我可能会接到代码营,并向我的学生展示 HACC。 这让我想到了MVC最大的优势之一是灵活性和将代码组织到包含的模块中的能力。 我们可以通过构建代码将代码组织成不同的类和导航控制器。 我们可以隔离代码并保持松散耦合,以获得更可以测试的代码。

现在我不能告诉你有多少次我看到奇妙的代码崩溃了。 过多次,我见过人们说"我们使用 MVC",并且说它保证你的代码不仅使用当前技术,而正确。 MVC是一个框架,就像任何它的他框架一样,这就意味着它只与代码的设计和程序员的工作一样。 如果有保证好代码的技术,我们就会失去工作。

现在已经说过,有很多开发人员适当地利用 MVC。 他们使用正确的关注点分离。 他们使用控制器和控制器操作的逻辑分组来设置控制器。 但是这是另一个发布到本身的文章,而MVC可以被侵害的方式。

除这里之外,我看到的最多的一个地方是最基本的结构和模式。 例如假设你在部分视图中编写如下代码:

<div>Number 1 : <inputtype="text"id="Number1"/><br/>Number 2 : <inputtype="text"id="Number2"/><br/><inputtype="button"id="btnAddNumbers"onclick="AddNumbers()"value="Add Numbers"/></div>

现在像任何优秀的开发人员一样,你将JavaScript代码放在单独的JS文件中,称为" Add.js"。 它包含以下代码:

function AddNumbers() {var num1 = parseInt($("#Number1").val());var num2 = parseInt($("#Number2").val());var total = num1 + num2;
 alert(total);
 }

现在,对于我们大多数人来说,这看起来就像完美的JavaScript代码。 这里没什么特别的。当你去添加这个页面时,你在页面的head 标记中添加了对JS文件的引用。 一切都正常,对吧?

不完全。"。"。现在,在所谓的全局命名空间中声明JavaScript代码 上面。 表示代码在页级别上声明,并且这里函数中的所有内容都可以用于整个页。

问题是,当另一个开发人员用以下HTML编写部分视图时会发生什么情况:

<div>Number to increment:<inputtype="text"id="NumberValue"/><br/><inputtype="button"id="btnAdd"value="Increment Number"onclick="AddNumbers()"/></div>

并编写以下函数:

function AddNumbers()
{
 var num = parseInt($("#NumberValue").val());
 num = num + 1;
 $("#NumberValue").val(num);
}

他们在页面底部声明了 JS,认为它会在最后加载,并将它的部分视图插入到同一视图中。 问题是现在会发生什么? 有两个用相同的NAME 声明的函数。 如果这是服务器端代码,我们将得到编译错误。

我将在" Number 1"文本框中输入" 1",在" Number 2"文本框中输入" 2",然后单击" Add Numbers"按钮,然后在" NumberValue"文本框中得到一个" NaN"。

现在为什么因为浏览器加载页面时,它从上向下,这意味着它将" AddNumbers"函数替换为。 这是因为JavaScript处理函数的方式与对象的方式相同。 因这里,通过在全局命名空间中声明它,你允许代码可以能被某人替换。

那么你能做什么? 实际上,最好的选择是范围你的JavaScript,以便它不坐在全局命名空间中,并呈现这种情况。 通过像对待对象一样处理函数,并按照以下方式修改代码。

function CalcMath() {var addNumbers = function () 
 {var num1 = parseInt($("#Number1").val());var num2 = parseInt($("#Number2").val());var total = num1 + num2;
 alert(total);
 }return {
 AddNumbers : addNumbers
 }
 }

这将创建一个名为" CalcMath"的对象,并创建一个名为" AddNumbers"的"鏂规碜"。 这允许我更新按钮以获得以下信息:

<div>Number 1 : <inputtype="text"id="Number1"/><br/>Number 2 : <inputtype="text"id="Number2"/><br/><inputtype="button"id="btnAddNumbers"onclick="CalcMath().AddNumbers()"value="Add Numbers"/></div>

如果有人添加了名为" AddNumbers"的函数,它对你的部分视图没有任何影响。 这允许所有的内容都表达模块化,并且分离并保持它的他代码在未来影响代码。

很多JavaScript框架都基于这个原则,并将它的用作它们提供的其它好处的基础。

这就是现在,更多的来源于演示文稿,更更具体的来源于创业者的资源。