Javascript 不理解为什么需要return语句
在讨论模拟jquery$的javascript时,我无法理解为什么在这个场景中需要Javascript 不理解为什么需要return语句,javascript,class,constructor,Javascript,Class,Constructor,在讨论模拟jquery$的javascript时,我无法理解为什么在这个场景中需要return 这是我正在查看的代码 $ = function(selector){ if ( !(this instanceof $) ) { return new $(selector); } var elements = document.querySelectorAll(selector); Array.p
return
这是我正在查看的代码
$ = function(selector){
if ( !(this instanceof $) ) {
return new $(selector);
}
var elements = document.querySelectorAll(selector);
Array.prototype.push.apply(this,elements);
};
有人能给我解释一下为什么返回新的$(选择器)有效,而不仅仅是新的$(选择器)?当你做一个返回,你是开始从一开始就用新的关键字吗?我很难想象这一切。请帮忙
对不起,如果我没说清楚的话。我的问题是“returnnew$(selector)语句与justnew$(selector)语句有什么不同。当我在这个if语句中放置一个调试器并在
this
上放置一个观察者时,最初this
是一个窗口,当我单步执行该函数时,我看到在运行return new$(选择器)之后,它返回到if语句以查看这是否是instanceof$(因为现在this
指向$)。这是怎么发生的是我的问题。有人能告诉我什么时候执行“returnnew$(selector)”,这是返回到哪里的吗???这是一个常见的JavaScript习惯用法,确保您处理的是实例对象而不是类对象
(从技术上讲,JavaScript是一个基于原型的对象系统,但类/实例的区别是描述这种关系的最常见/可识别的隐喻。)
$=函数(选择器).
定义对象的“类”的行为方式。按理说,每次调用$(…)
实例化新对象时,实际上需要调用new$(…)
来返回类的新实例<代码>$(…)不仅仅是一个函数调用;实际上,它是一个构造函数。它定义了如何形成类的新实例。测试和返回新$(选择器)的小实例正在自动执行所需的新
——这是一件非常容易忘记的事情,实际上通常是习惯用法,不能使用。保护条件存在,因此您不必手动调用new
$ = function(selector) {
if ( !(this instanceof $) ) {
// if was called naked, without new, auto-new an instance
return new $(selector);
}
// by time execution arrives here, we have guaranteed that we are
// dealing with an instance of $, not $ itself (i.e. an instance not
// the class)
var elements = document.querySelectorAll(selector);
// use Array class to make this instance an array-like
// object holding the selected DOM elements
Array.prototype.push.apply(this,elements);
};
更新/澄清保护条件内的返回
立即结束初始的$(…)
调用,返回新$(…)
的值。这基本上是一个递归定义——尽管是一个递归的小例子,最多只递归一次。有两个逻辑案例需要考虑。
如果调用了$(…)
,则递归并返回新$(…)
的值。return
是必需的,因为如果没有使用return
,JavaScript函数默认返回undefined
。因此,代码必须显式返回new…
的值
如果调用了new$(…)
(直接调用,或者通过来自保护条件的简单一步递归),那么我们正在处理一个实例。使用document.querySelectorAll
查找适当的节点,并Array.prototype.push
将它们加载到此实例中。在这种情况下,不需要return
,因为new
函数调用具有内在的魔力,它总是返回创建的实例。因此,所需的只是根据需要加载实例。它将自动返回
因此,典型用法如下:
$('p.main')
是原始调用
$
函数检查并发现它没有处理实例,
因此递归,调用new$('p.main')
$
函数在第二个递归调用中,现在正在处理一个实例。
它将DOM节点加载到此实例中,并使用
new
的神奇特殊处理
新实例将返回到原始调用的保护条件。
它必须显式返回该值,因为它最初未被调用
使用new,使外部原始调用不享受new
magic
自动返回。它显式返回新的
实例添加到原始调用方
这是为了避免每次需要与方法交互时都需要执行new$(“yourSelector”)
。行,this instanceof$
,检查我们是否在函数的实例化版本中,而不仅仅是函数本身
因此,如果(这个$instanceof)
是false
,我们需要通过执行返回新的$(选择器)
来实例化该函数。返回值很重要,因为此时我们正处于一个普通函数中。这样,无论我们现在以何种方式调用$
函数,我们都会得到一个实例 我认为我对这整件事感到不安的是缺乏关于这件事的明确的官方文件(或者我只是找不到它们,或者我没有足够的研究(显然没有)
我从下面的旧问答中找到了一个很好的例子
它有这样一个例子:
function loop(x) {
if (x >= 10)
return x;
loop(x + 1); // the recursive call
}
loop(0);
用我的裸眼和未经训练的眼睛,它看起来像是当你递归起来,最终当x变成10时,它说要返回x
。现在,我假设,这会返回给它的调用者(即循环(x+1)?)。由于没有返回语句,整个内容返回未定义。这是正确的吗?对不起,我不是问关键字new
在做什么。我是问为什么需要返回
。我在原始帖子中做了更长的后期编辑。你能看看我的问题现在是否清楚吗?我已经添加了更多的细节ed,关于如何调用报税表的详细说明。感谢您详细的回答。我会继续接受它作为回答,但现在我不知道为什么只做“new$(选择器)”就行了'不起作用。这样做也是递归的,我想知道会发生什么。如果我们用/new关键字来调用它,它不需要我们按照new的定义显式返回,为什么我们要