提交 25c7b065 编写于 作者: W wizardforcel

2020-06-07 11:18:03

上级 0eb98d5a
# JavaScript –相等(==)与身份(===)运算符
# JavaScript – 相等(`==`)与相同(`===`)运算符
> 原文: [https://howtodoinjava.com/javascript/javascript-equality-vs-identity-operators/](https://howtodoinjava.com/javascript/javascript-equality-vs-identity-operators/)
......@@ -46,6 +46,6 @@ Output is: ValueOne and ValueTwo are NOT the same
由于我们在这种情况下使用了`===`运算符,并且由于该运算符未执行任何类型转换,因此我们看到字符串值`"3"`和数字`3`毕竟是不同的。
When in doubt, a relatively safe choice is simply to use the identity operator (===) as a matter of habit. Of course, the safest choice is to familiarize yourself with the differences, so that you know what is actually happening under the hood.
如有疑问,相对安全的选择只是出于习惯而使用身份运算符(`===`)。 当然,最安全的选择是使自己熟悉这些差异,以便您了解引擎盖下实际发生的事情。
学习愉快!
\ No newline at end of file
# 您必须知道的 JavaScript 可变范围规则
# 您必须知道的 JavaScript 变量范围规则
> 原文: [https://howtodoinjava.com/javascript/javascript-variable-scope-rules/](https://howtodoinjava.com/javascript/javascript-variable-scope-rules/)
......@@ -7,9 +7,9 @@
在 JavaScript 中,变量仅通过两种方式限定范围:
1. 全局范围
2. 功能范围
2. 函数范围
只需记住,当您使用`var`关键字定义变量时,就声明了 JavaScript 中的作用域。 让我们从简单的一个开始 -Java 中的全局范围变量。
只需记住,当您使用`var`关键字定义变量时,就声明了 JavaScript 中的作用域。 让我们从简单的一个开始 - Java 中的全局范围变量。
## 全局范围
......@@ -30,7 +30,7 @@ console.log(foo); //I am GLOBAL foo
```
#### 在任何函数中定义的变量 - 无需使用“ var”关键字
#### 在任何函数中定义的变量 - 无需使用“`var`”关键字
```java
//'foo' is function local variable
......@@ -45,9 +45,9 @@ console.log(window.foo); //I am GLOBAL foo
所有全局作用域变量均作为`window`对象的属性可见。
## 功能范围
## 函数范围
从全局作用域详细信息可以明显看出,函数作用域变量是在函数内部使用“ var”关键字声明的。
从全局作用域详细信息可以明显看出,函数作用域变量是在函数内部使用“`var`”关键字声明的。
```java
//'foo' is function local variable
......@@ -60,11 +60,11 @@ console.log(foo); //foo is not defined
```
请注意, **javascript 函数具有自己的作用域,但是块(例如 while,if 和 for 语句)则没有**
请注意, **javascript 函数具有自己的作用域,但是块(例如`while`,`if`和`for`语句)则没有**
## 混合全局变量和函数范围变量
现在,在基本理解之后,我们来看一个示例,在该示例中,我们将在单个页面的不同范围中使用变量 foo,然后我们将在**上明确说明 javascript 范围的工作原理**
现在,在基本理解之后,我们来看一个示例,在该示例中,我们将在单个页面的不同范围中使用变量`foo`,然后我们将在其上**明确说明 javascript 范围的工作原理**
```java
//Define global scoped 'foo'
......@@ -96,7 +96,7 @@ console.log( foo ); //I am GLOBAL foo TOO
了解仅在函数内部声明的`foo`如何具有自己的作用域,否则所有`foo`变量都引用全局作用域`foo`
TIP: You should ALWAYS initialize variables with var, regardless of scope. This way, your variables will have the scope you expected, and you can avoid accidental globals.
提示:无论范围如何,都应始终使用`var`初始化变量。 这样,您的变量将具有您期望的范围,并且可以避免意外的全局变量。
我希望当我们谈论 javascript 变量的范围时能够使我更加清楚。 将我的问题放在评论部分。
......
......@@ -2,7 +2,7 @@
> 原文: [https://howtodoinjava.com/javascript/javascript-correct-way-to-define-global-variables/](https://howtodoinjava.com/javascript/javascript-correct-way-to-define-global-variables/)
我们知道什么是 [**全局变量**](https://en.wikipedia.org/wiki/Global_variable "Global variable") 或常量,它们是可在应用范围内访问的字段。 在 Java 中,通常是通过定义“ **public static** ”字段来完成的。 在这里,通过添加 final 关键字,我们可以将全局变量更改为**全局常量**。 很容易,对吧?
我们知道什么是[**全局变量**](https://en.wikipedia.org/wiki/Global_variable "Global variable")或常量,它们是可在应用范围内访问的字段。 在 Java 中,通常是通过定义“`public static`”字段来完成的。 在这里,通过添加`final`关键字,我们可以将全局变量更改为**全局常量**。 很容易,对吧?
但是 javascript 呢? 这些脚本语言没有这些访问修饰符等,那么我们有什么选择呢?
......@@ -24,7 +24,7 @@ function doSomething()
```
这些类型实际上是在很长一段时间内声明的,对于一些不幸的伙伴来说,它会导致 Java 脚本中出现著名的**“对象不支持此属性或方法”** 错误。 如果您还记得一个 **IE 错误,它带有“ var a = foo”,则仅声明了文件范围**的全局变量。 这是 IE 臭名昭著的解释器的问题。
这些类型实际上是在很长一段时间内声明的,对于一些不幸的伙伴来说,它会导致 Java 脚本中出现著名的“对象不支持此属性或方法”错误。 如果您还记得一个 **IE 错误,它带有“`var a = foo`”,则仅声明了文件范围**的全局变量。 这是 IE 臭名昭著的解释器的问题。
那么,在 JavaScript 中声明全局变量的正确方法是什么?
......@@ -51,9 +51,9 @@ function doSomething()
## **要点:**
1. 使用 window 关键字以“ window.VAR_NAME”的形式定义全局变量
2. 您可以使用“ window.VAR_NAME”或直接“ VAR_NAME”访问变量
3. 不要使用同名的其他变量,否则可能会导致不良结果
1. 使用`window`关键字以“`window.VAR_NAME`”的形式定义全局变量
2. 您可以使用“`window.VAR_NAME`”或直接“`VAR_NAME`”访问变量
3. 不要使用同名的其他变量,否则可能会导致不良结果
所有人都在这个话题上。
......
......@@ -2,13 +2,13 @@
> 原文: [https://howtodoinjava.com/javascript/implement-mvc-and-pubsub-in-javascript/](https://howtodoinjava.com/javascript/implement-mvc-and-pubsub-in-javascript/)
我们知道什么是 MVC? MVC 代表 [**模型 - 视图 - 控制器**](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller "MVC") 。 简而言之,MVC 是一种设计技术,其中将应用组件分为 3 组,以便可以独立开发它们而无需考虑它们将如何交互。 如果构建正确,则很少有配置代码可以绑定它们,并且可以立即使用。
我们知道什么是 MVC? MVC 代表[**模型 - 视图 - 控制器**](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller "MVC")。 简而言之,MVC 是一种设计技术,其中将应用组件分为 3 组,以便可以独立开发它们而无需考虑它们将如何交互。 如果构建正确,则很少有配置代码可以绑定它们,并且可以立即使用。
[**PubSub(发布者订阅者)**](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern "pubsub") 模型是设计范式,其中多个订阅者正在监听源上的更改事件,并且一旦发生任何更改,便会立即通知监听器。 在用户交互影响屏幕上多个部分的大型系统中,此模式消除了许多硬编码,并提供了设计灵活性。
![PubSub + MVC in JavaScript](img/99dc384aba029061cae775869ac41f18.png)
PubSub + MVC in JavaScript
JavaScript 中的 PubSub + MVC
......@@ -30,10 +30,11 @@ Demo application
例如,我以媒体播放器为例。 此媒体播放器附有一个播放列表,用户可以使用按键事件在此播放列表上向前和向后移动。
**型号:**存储当前视图状态
**模型**存储当前视图状态
播放列表–数组对象将所有曲目存储在当前可用的播放列表中。
currentIndex –当前播放的曲目
`playlist` – 数组对象将所有曲目存储在当前可用的播放列表中。
`currentIndex` – 当前播放的曲目
模型还包含帮助用户在用户交互后保持其当前状态更改的功能。
......@@ -66,7 +67,7 @@ var Model = {
```
**视图:**表示用户与之交互的屏幕
**视图**表示用户与之交互的屏幕
该对象只有一种方法可以在屏幕上呈现用户事件的结果。
......@@ -79,7 +80,7 @@ var View = {
```
**控制器:**视图调用控制器以更改模型
**控制器**视图调用控制器以更改模型
控制器具有在用户交互期间将被调用的功能。
......@@ -137,18 +138,18 @@ subscribers.push(View);
在上面的代码段中,假设用户按下了播放列表中的下一首曲目。 这是控制流:
1. 用户按下“下一首”按钮
2. 控制器的 moveNext()方法称为
3. moveNext()触发模型的 next()方法
4. next()方法增加当前正在播放曲目的 currentIndex
5. next()方法使用 publish()方法发布事件
6. publish()方法调用 notify()方法是所有注册的订户
7. Views notify()方法根据模型的当前状态更新用户屏幕
2. 控制器的`moveNext()`方法调用
3. `moveNext()`触发模型的`next()`方法
4. `next()`方法增加当前正在播放曲目的`currentIndex`
5. `next()`方法使用`publish()`方法发布事件
6. `publish()`方法调用`notify()`方法是所有注册的订户
7. 视图`notify()`方法根据模型的当前状态更新用户屏幕
这样,所有可能的事件都将从 Controller 处理到视图层。 最后,我们一直都处于模型的当前状态。
这样,所有可能的事件都将从控制器处理到视图层。 最后,我们一直都处于模型的当前状态。
## **演示应用**
我已经在一个文件中使用了上述所有代码段,并使用 HTML select 元素进行了虚拟播放列表行为。 select 的当前选定选项代表媒体播放器中当前播放的曲目。
我已经在一个文件中使用了上述所有代码段,并使用 HTML `select`元素进行了虚拟播放列表行为。 `select`的当前选定选项代表媒体播放器中当前播放的曲目。
让我们看一下完整的演示代码:
......@@ -241,19 +242,20 @@ function initializeModel()
```
上面的代码还有另外一个方法 initializeModel(),该方法用于在页面加载时使用播放列表项初始化模型对象。 现在,当我们按“下一个曲目”时,选择元素中的下一个选项被选中。 同样,按下“上一曲目”按钮,则在选择列表中选择了上一个选项。
上面的代码还有另外一个方法`initializeModel()`,该方法用于在页面加载时使用播放列表项初始化模型对象。 现在,当我们按“下一个曲目”时,选择元素中的下一个选项被选中。 同样,按下“上一曲目”按钮,则在选择列表中选择了上一个选项。
您将看到如下运行代码:
![Demo Screen of MVC + PubSub w2ith JavaScript](img/e7477019257a9b6e0381400e2cb96ca7.png)
Demo Screen of MVC + PubSub w2ith JavaScript
JavaScript 中的 MVC + PubSub 的示例界面
如果不清楚或您有任何建议/查询,请发表评论。
————————————————————————————————————
**更新:**
经过简短的邮件讨论后,Brook Monroe 向我发送了类似示例的更好的代码示例。 尽管本教程的目的不是更好的代码实践,而是详细介绍了概念。 我在下面共享更新的代码以供参考。 它可能会帮助您。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册