JavaScript变量定义和范围
JavaScript variable definition and scope
我试图了解绑定事件时变量作用域是如何工作的。
以下示例运行良好:
function clickHandler() {
alert(foo);
}
var foo = true;
$('div').on({
'click': clickHandler
});
请参阅:http://jsfiddle.net/OliverJAsh/7fM5U/4/
然而,当我做出这个简单的改变时,它就不再起作用了:
function clickHandler() {
alert(foo);
}
(function () {
var foo = true;
$('div').on({
'click': clickHandler
});
}());
请参阅:http://jsfiddle.net/OliverJAsh/7fM5U/3/
你将如何使第二个例子发挥作用?我能用.call
做点什么吗?我想知道这一点,因为函数是在定义变量的地方被调用的,所以我希望它能够访问它。
更新:
我理解它为什么不能访问变量,但因为函数是从定义变量的地方调用的,我想知道如何在不移动范围的情况下使它工作。我想我是在问.call
方法。
如果使用var
在函数内声明变量,则只能在该函数内或该函数内声明的函数内访问该变量。
clickHandler
是在声明foo
的函数之外声明的,因此它是不可访问的。
如果您将clickHandler
的声明移动到函数中,您将看到它工作得很好;
(function () {
var foo = true;
function clickHandler() {
alert(foo);
}
$('div').on({
'click': clickHandler
});
}());
如果不能移动clickHandler
,则必须修改它以访问foo
作为参数;
function clickHandler(foo) {
alert(foo);
}
(function () {
var foo = true;
$('div').on({
'click': function () {
// We can access `foo` here because the function is being declared within the scope of `foo`.
clickHandler(foo);
}
});
}());
在javascript中,变量的作用域在函数内,因此foo的作用域位于匿名(function () { .. }());
内,而clickHandler
不可见。
要修复它,您可以将clickHandler
函数引入匿名函数,如下所示:
(function () {
var foo = true;
var clickHandler = function() {
alert(foo);
}
$('div').on({
'click': clickHandler
});
}());
更新
如果单击处理程序函数无法更改作用域,并且也不希望更改签名,则可以使用call
函数,如下所示:
function clickHandler () {
alert(this);
}
(function () {
var foo = true;
$('div').on({
'click': function() { clickHandler.call(foo); }
});
}());
因为var foo没有公开定义。。。。试试这个代码
var foo = true;
function clickHandler() {
alert(foo);
}
(function () {
foo = true;
$('div').on({
'click': clickHandler
});
}());
当您用匿名函数包装函数时,javascript解析器会将所有块解析在一起,并将其作为单独的块执行。
您必须将函数clickHandler
的定义放入块
- 将自定义css保持在角度范围内
- AngularJS:'$范围未定义'
- 从GWT中的HighCharts库(以及一般的Javascript)自定义Stockchart范围选择器按钮
- 对于使用传递的数据计算的局部范围变量,角度绑定在自定义指令中不起作用
- Javascript 变量范围未定义
- 具有用户范围的Google Analytics自定义维度使用情况
- 从html调用angularjs控制器中的一个函数,但未定义范围变量
- 范围中匹配日期值的自定义ng筛选器
- 在类范围内定义javascript的变量
- AngularJS范围未定义
- 隔离范围-仅在指令范围内定义的值必须执行更改
- 变量未定义/超出范围
- AngularJS范围定义的函数为null
- 因果报应测试中未定义的预期范围变量
- Extjs 4,事件处理,范围,自定义组件
- 在ColdFusion中表单范围中未定义AJAX请求的发布参数
- 当生成正态分布的随机值时,定义范围的最有效方法是什么
- 创建可在任何地方使用的 JS 函数?范围和功能“未定义”的问题
- 为什么我的用户范围的自定义维度会根据过去的匹配而发生变化
- c++ /CX:在命名空间范围定义公共void