我正在尝试理解Var的咒语概念。
据我所知,它只是一个值的引用/指针。 "根值" Var的一个可以被认为是Var指向一个线程的初始值。此外,我认为 - 在幕后 - 每个Var都有一个地址指向它所指向的内存中的位置(即使像Java这样的语言,Javascript也不能让你访问那个特定的位置,也许在幕后做一些让地址不稳定的事情。)
问题:这是考虑它的正确方法吗?将clojure Var视为一个值的引用/指针是什么意思?
给出类似
的内容(def v 7)
是否适合说" Var#' v指向值7"?
答案 0 :(得分:4)
var main = function(){
$('.arrow-next').click(function(){
var currentSlide = $('.active-slide');
var nextSlide = currentSlide.next();
if (nextSlide.length == 0){
nextSlide = $('.slide').first();
}
currentSlide.fadeOut(600).removeClass('active-slide');
nextSlide.fadeIn(600).addClass('active-slide');
currentDot = $('.active-dot');
nextDot = currentDot.next();
if (nextDot.length == 0){
nextDot = $('.dot').first();
}
currentDot.removeClass('active-dot');
nextDot.addClass('active-dot');
});
$('.arrow-prev').click(function(){
var currentSlide = $('.active-slide');
var prevSlide = currentSlide.prev();
if (prevSlide.length == 0){
prevSlide = $('.slide').last();
}
currentSlide.fadeOut(600).removeCLass('active-slide');
prevSlide.fadeIn(600).addClass('active-slide');
currentDot = $('.active-dot');
prevDot = currentDot.prev();
if (prevDot.lenth == 0){
prevDot = $('.dot').last();
}
currentDot.removeClass('active-dot');
prevDot.addClass('active-dot');
});
};
$(document).ready(main);
扩展为#'v
,说var(var v)没有意义,相反我会说var v。我也会说(var v)
到值7而不是指着。是的,它们的行为类似于指针,但它们有一个特殊的derefs
(或@)形式来取消引用它们(并且你不能做指针算术)。
我认为采用术语deref
对于理解Clojure的另一个方面很重要:当你使用任何符号时,假设我们进行函数调用deref
,实际上有一个隐藏的步骤! (inc 1)
是与var inc
相关联的符号,(inc
实际上并不是函数!inc
只是对函数进行了解析)但随后自动对vars进行了评估{{ 1}}。当你写(var inc)时,你实际上只是在阻止inc
。这就是为什么当您更改或替换var时,假设我们重新定义了deref
,新代码就会被执行。
关键在于,在考虑指针时,您可能会想将inc视为某些var指向的函数。这是不正确的。 inc是与derefs到函数的var相关联的符号。使用var inc时,它会自动解析为函数。从这个意义上讲,你可以说只是说v值为7是准确的。 v是一个var,你真的不需要指定它。 (显然,当你试图明确地指出它是一个var时,它是有意义的,因此将它称为var也没有错误。)