标签: lexical-scope

为什么jQuery在开始时会有一个"window = this"并说它会加快对窗口的引用?

当我打开jQuery的源代码时,我找到了这一行.

var 
// Will speed up references to window, and allows munging its name.
window = this
Run Code Online (Sandbox Code Playgroud)

这条线为什么以及如何加速?

javascript jquery lexical-scope

3
推荐指数
1
解决办法
634
查看次数

任何人都可以在另一个函数内解释这个函数的行为吗?

我试图理解Javascript中的词法范围.在下面的例子中,我在另一个函数中编写了一个函数.当我运行时,我希望在第一个警报中弹出"爸爸",在第二个警报中弹出"妈妈".但实际发生的是,它在第​​一个弹出窗口显示"未定义",在第二个弹出窗口显示"妈妈".

function first(){
  var x = "dad"; 
  function second(){
    alert(x);
    var x = "mom";
    alert(x);
  }
  second();
}
first();
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么在父函数中定义的变量"x"在子函数中不可见?奇怪的是,当我在子函数中删除变量"x"的声明时,它工作正常.有人可以在这里有效地了解词汇范围场景吗?

javascript lexical-scope web

3
推荐指数
1
解决办法
49
查看次数

在Perl中,"$ a"和"$ b"在sort()函数之外有什么特殊用途吗?

sort()几天我问了一个关于在Perl 函数中使用"$ a"和"$ b"的问题:

Perl的"sort()"函数究竟是什么"$ a"和"$ b"?

我现在有一个跟进问题.是"$ a"和"$ b"仅使用sort()或是否有任何其他Perl函数利用这些特殊的全局变量?

或者即使没有其他功能使用它们,是否还有其他情况sort()你会使用"$ a"或"$ b"?

编辑:

澄清:

简而言之,问题是"$ a"和"$ b"可以被其他东西使用sort()吗?

我只是想知道他们可以使用的其他情况.我从未见过其他任何东西使用的"$ a"或"$ b",并且想知道除了之外还有其他任何特殊用途sort().

perl global-variables lexical-scope

3
推荐指数
1
解决办法
214
查看次数

符号和名称是否不同?

符号和名称是否不同?保罗·格雷厄姆(Paul Graham)的Lisp,侧重于普通的口齿不清,有一些似乎暗示的讨论,例如

由于lambda表达式也是函数的名称,它们也可以首先出现在函数调用中:
((lambda(x)(*x 2)3)
6

这使得听起来像符号是名称,但名称不是符号.但我不明白什么样的Lisp"对象"符号是/可能的.

这也是源于在sharp-quote(#')运算符v.的问题symbol-function.我怀疑这些不同的唯一原因是因为并非所有的名字都是符号,但我还没有足够的背景来理解这些答案(因此这个问题).

我也要求在elisp诉普通lisp中澄清.我假设这与lexical形式有关,直到版本24(我认为24.1)才在elisp中引入.

lisp symbols elisp common-lisp lexical-scope

3
推荐指数
1
解决办法
148
查看次数

< - 和<<之间的区别 -

情况1:

rm(list = ls())
foo <- function(x = 6){
  set <- function(){
  x <- x*x}
  set()
x}
foo()
# [1] 6
Run Code Online (Sandbox Code Playgroud)

案例2:

rm(list = ls())
foo <- function(x = 6){
set <- function(){
  x <<- x*x}
  set()
  x}
foo()
# [1] 36
Run Code Online (Sandbox Code Playgroud)

我读到该<<-运算符可用于为与当前环境不同的环境中的对象赋值.它表示<<-可以对不在当前环境中的对象进行对象初始化.我想问一下可以使用哪个环境的对象进行初始化<<-.在我的情况下环境是foo功能环境,可以<<-初始化函数外部的对象或当前环境中的对象吗?完全混淆何时使用<-以及何时使用<<-.

r lexical-scope

3
推荐指数
1
解决办法
376
查看次数

了解评估的环境模型

SICP 中的练习 3.20:

绘制环境图来说明表达式序列的求值

(define x (cons 1 2))
(define z (cons x x))


(set-car! (cdr z) 17)

(car x) 17
Run Code Online (Sandbox Code Playgroud)

使用上面给出的对的程序实现。

我的眼睛被毁了所以我不能画画。相反,我会尽力想象环境模型如何演变。

首先,这是程序对的实现。

(define (cons x y)
  (define (set-x! v) (set! x v))
  (define (set-y! v) (set! y v))
  (define (dispatch m)
    (cond ((eq? m 'car) x)
          ((eq? m 'cdr) y)
          ((eq? m 'set-car!) set-x!)
          ((eq? m 'set-cdr!) set-y!)
          (else (error "Undefined 
                 operation: CONS" m))))
  dispatch)

(define (car z) (z 'car))
(define (cdr z) (z 'cdr))

(define (set-car! z …
Run Code Online (Sandbox Code Playgroud)

evaluation scheme sicp lexical-scope

3
推荐指数
1
解决办法
459
查看次数

Common Lisp宏中的词法绑定

我目前正在通过Graham的On Lisp工作,发现这一点很难理解:

绑定.词汇变量必须直接出现在源代码中.setq例如,没有计算第一个参数,所以任何构建的都setq必须是一个扩展为a的宏setq,而不是一个调用它的函数.同样对于运算符,例如let,其参数在lambda表达式中作为参数出现,对于像扩展为lets的宏这样的运算,依此类推.任何要更改其参数的词法绑定的新运算符都必须写为宏.

这来自第8章,其中描述了何时应该和不应该使用宏来代替函数.

他在这一段中究竟是什么意思?有人会给出一两个具体的例子吗?

非常感激!

lisp macros common-lisp lexical-scope

3
推荐指数
1
解决办法
131
查看次数

为什么需要IIFE创建新的范围?

不懂JS的人开始

for (var i=1; i<=5; i++) {
    setTimeout( function timer(){
        console.log( i );
    }, i*1000 );
}
Run Code Online (Sandbox Code Playgroud)

6
6
6
6
6
Run Code Online (Sandbox Code Playgroud)

但是像这样使用IIFE

for (var i=1; i<=5; i++) {
    (function(){
        var j = i;
        setTimeout( function timer(){
            console.log( j );
        }, j*1000 );
    })();
}
Run Code Online (Sandbox Code Playgroud)

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么不

for (var i=1; i<=5; i++) {
    setTimeout( function timer(){
        var j = i;
        console.log( j );
    }, i*1000 );
}
Run Code Online (Sandbox Code Playgroud)

要么

for (var i=1; …
Run Code Online (Sandbox Code Playgroud)

javascript closures lexical-scope

3
推荐指数
1
解决办法
268
查看次数

Perl 替换值而不更新数组

我有以下 Perl 脚本。

#!/usr/bin/perl
use strict;
use warnings;
use Data::Dumper;

my @fruits = qw(apple banana orange pear);

print Dumper \@fruits;

foreach my $fruit (@fruits) {
  $fruit =~ s|apple|peach|;
}

print Dumper \@fruits;
Run Code Online (Sandbox Code Playgroud)

返回以下内容。

$VAR1 = [
          'apple',
          'banana',
          'orange',
          'pear'
        ];
$VAR1 = [
          'peach',
          'banana',
          'orange',
          'pear'
        ];
Run Code Online (Sandbox Code Playgroud)

我不明白为什么以下行将 @fruits 数组中的 apple 更改为 peach,因为我认为此行仅适用于 $fruit 变量,而不适用于 @fruits 数组。

$fruit =~ s|apple|peach|;
Run Code Online (Sandbox Code Playgroud)

perl lexical-scope

3
推荐指数
1
解决办法
66
查看次数

理解 golang 中的词法范围

https://play.golang.org/p/kK9c71Yt9N - 这是我正在使用的代码。

我试图了解变量的词法范围X。如果我使用第:=11 行中的运算符,则X定义在外的func main会被隐藏,并且会在函数内创建一个新的作用域。如果我=在同一行中使用运算符,编译器会抱怨err未定义。

我的理解是:=操作员创建了未定义的变量,因此只err需要定义即可。但是,这种理解显然是错误的。

我可以做哪些代码更改以确保X不在 内重新定义main()

我知道我可以执行以下操作以确保X不会在 内重新定义main()

var err error
X, err = InitX()
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法可以让我失踪?

go lexical-scope

2
推荐指数
1
解决办法
872
查看次数