JavaScript问题

分享于 

10分钟阅读

Web开发

  繁體 雙語

介绍

在本文中,我们将通过解决回答问题来讨论一些 JavaScript的概念。 我希望这能帮助我们更深入地理解 JavaScript。

Background

在继续之前,我想讨论 Closure Closure Hoisting和提升的原则 JavaScript JavaScript

这个函数返回的函数是一个堆栈帧,当函数返回时,它不会被释放。

在JavaScript中,将变量移动到脚本顶部,然后运行。 这是因为,JavaScript没有词法范围。

JavaScript问题及其简单答案

让我们从问题和答案开始学习。

问题一

下面三行代码的执行之后,<code> x , y 和 z的值是多少?

var x=5,y=6,z; 
x=y++; //what will be x and y?z=++y; //what will be z and y? 
先来吧 <code><code> x=y++ 在 上面 代码行中,实际执行将在解释 below的两个步骤中发生:
x=y; //x=6//y will be assigned to x first before it gets incremented.y=y+1; //y=7 
因此, x的价值将为 6, y的值为 7.

我们来看看 2nd 线 z=++y。 在单行中,实际执行将发生在 2个步骤中,如 below:
y=y+1 //y=7+1=8 y will be incremented first before it will be assigned to z.z=y //z=8 
因此 z的值将为 8,y的值将为 8.

JavaScript提升问题 1

让我们先看看提升的第一个问题。

var x = 5;function c() {
 if (typeof(x) === 'undefined') {
 var x = 10;
 alert(x);
 }
 alert(x);//what would be the result?}
c(); 
alert(x);//what will be the value of x? 

上面 脚本的结果是什么? 选择任意一个选项:

  • 使用值提醒 2次: 5和 5
  • 使用值提醒 2次: 10和 10
  • 使用值提醒 3次: 10,10和 10
  • 使用值提醒 3次: 10,10和 5

答案是 4

让我们来讨论一下:

在JavaScript中,变量具有全局和功能的范围。 在 上面 脚本中,变量 x 已经定义并赋值为 5. 这个 x 全局范围内,随处可用。 在函数中,我们再次声明了同样的变量( 如果条件条件为 inside。 因这里,当载入脚本时,函数被解析,变量 x 将升级到顶部 inside,并创建新的功能范围。 有一点是,有人在条件语句前先在函数的第一行声明了变量 x。 请参见 below:

var x=5;//x is already defined and assigned with value 5 and is available in Global scope.function c( ) {
 var x; // variable x get hoisted to the top.if (typeof(x) === 'undefined') {//therefore, here it will be undefined. x = 10;//assigning value 10 alert(x); //x will be 10 }
 alert(x);// x will be 10, value of x will be 10 inside the function scope.}
alert(x); // here the value of x will be still 5. Since it has its own value available in the global scope.

当我们调用函数 c 时,x 会再次被声明为函数的undefined inside 范围。 如果 x的值为,则如果为 true,undefined 将进一步分配,并且函数范围内的值将为。 但是,函数范围之外的x的值仍然是 5.

因此,在将所有变量声明为防止提升造成问题时,最好将所有变量声明在该区域顶部。 如果你在中测试代码,那么是一个很好的工具,它将建议你执行这一点。

JavaScript提升问题 2

below 脚本的结果是什么?

declareMe();//calling functionfnExpression();//calling function//Creating a function by declaration.function declareMe(){
 alert("this is function declaration");
}//creating a function by expression.var fnExpression = function(){
 alert("this is function expression");
}

:这个脚本将在调用调用中抛出异常,称 "Object Expected"

这是因为在JavaScript中,所有函数声明都被提升到脚本的顶部。 但是,函数表达式在求值之前不会被提升。 因此,declareMe 函数将在它的声明被评估之前可用。 因此,调用 declareMe() 将在没有任何异常的情况下进行评估。 但是,fnExpression() 调用将抛出异常,表示 "Object Expected"。 因为 fnExpression 是函数表达式,所以每次提升原则不会在脚本的顶部提升,除非函数表达式被评估。

让我在执行上下文的上下文中解释它

在ECMAScript函数中是对象,每一行JavaScript代码在单独的执行上下文中执行。

上面 代码行有 3个执行上下文。

  • 首先是全局执行上下文,在此过程中发生所有变量实例化并分配给全局对象。
  • 第二个是" declareMe"函数调用执行上下文。
  • 第三个是" fnExpression"函数调用执行上下文。

在全局执行上下文中:
变量实例化,并为所有函数声明创建函数对象并被分配给全局对象。 因此,创建的function object (for declareMe function) 由全局对象的属性引用,并带有 NAME" declareMe"。

但是,函数对象在全局执行上下文的变量实例化期间不是为函数表达式创建的。 因此,全局对象将具有名为" fnExpression"的属性,且没有指定函数对象。

将对 declareMe 函数( <code>declareMe ( ) ( 函数)的下一个执行上下文进行评估,因为全局对象已经具有引用对应的函数对象的属性,该属性将被调用。

而在最后一个执行上下文是 fnExpression 函数( fnExpression(); )的函数调用将导致 "Object Expected" 错误,因为全局对象没有指定对应函数对象的fnExpression

关闭问题

编写名为 newAdd的函数,这样通过以 below 方式调用,可以添加 2个数字:
newAdd(2)(5);

让我们用闭包原理来编写这个函数。

function newAdd(num1) {
 returnfunction (num2) {//num1 variable will be still alive after returning this anonymous function.return num1+num2;
 }
} 

上面 函数声明创建一个 num1 变量,该变量在

newAdd
函数作用域 num1 变量将由内部匿名函数使用,因为包含关闭。 所以当我们第一次打电话时 第二次调用passing匿名函数调用,设置脯氨酸等于 2,does和 num2的总和为 5,并将 final 结果返回为1.

上一个问题

这个问题是最后的,但仍然有重要的意义。

below 脚本的结果是什么
var x=5;
alert(x == "5") //what would be the result here?alert(x === "5") //what would be the result here?

回答: 第一个警告会说 true,第二个会说 false

== 相等运算符只比较值,它从不比较数据类型。 因此,第一个比较结果是 true。 === 相等运算符比较值和数据类型,因此 2nd 比较语句结果 false。 因此,如果我们想比较值和类型,那么我们应该使用 === 操作符。

var a= 0; if(a=='') {
 console.log("a=='' is true");
} else {
 console.log("a is 0");
}if(a === '') {
 console.log("a==='' is true");
}//What will be the output here 

答案是 "a==''is true"。所以如果你想用 a = 0 来打印 a is 0。 因此,第一个比较结果是 true。 因此,如果你想比较值和数据类型,那么总是使用 "===".

引用

我试图按我的理解写作,如果你有一些评论,我会试着回答,如果你看到我的例子。


相关文章