Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript:can';t访问变量_Javascript_Function_Variables - Fatal编程技术网

Javascript:can';t访问变量

Javascript:can';t访问变量,javascript,function,variables,Javascript,Function,Variables,我无法从标记点访问变量。错误控制台表示未声明该变量。我几年前就遇到了这个问题,我解决了它,但我在谷歌上搜索了几个小时,再也找不到解决方案了。 你有什么想法吗?问题是什么?我如何解决 提前谢谢 var smileys = [ [":smile:", "smile.png"], [":sad:", "sad.png"], [":love:", "love.png"], [":angry:", "angry.png"], [":amazed:", "amazed

我无法从标记点访问变量。错误控制台表示未声明该变量。我几年前就遇到了这个问题,我解决了它,但我在谷歌上搜索了几个小时,再也找不到解决方案了。 你有什么想法吗?问题是什么?我如何解决

提前谢谢

var smileys = [
    [":smile:", "smile.png"],
    [":sad:", "sad.png"],
    [":love:", "love.png"],
    [":angry:", "angry.png"],
    [":amazed:", "amazed.png"],
    [":laugh:", "laugh.png"],
    [":wink:", "wink.png"],
    [":crying:", "crying.png"],
];

$(document).ready(function(){

    for(var i=0; i<smileys.length; i++){
        var smiley = document.createElement("img");
        smiley.src = "./res/" + smileys[i][1];
        smiley.style.width = "24px";
        smiley.style.height = "24px";
        smiley.onclick = function(){
            alert(smileys[i][0]);
            // $("#chat-input").append(smileys[i][0]);
        };

        $("#smileys").append(smiley);
    }
});
var smileys=[
[“:smile:”,“smile.png”],
[“:sad:”,“sad.png”],
[“:love:”,“love.png”],
[“:angry:”,“angry.png”],
[“:惊奇:”,“惊奇.png”],
[“:laugh:”,“laugh.png”],
[“:wink:”,“wink.png”],
[“:crying:”,“crying.png”],
];
$(文档).ready(函数(){

对于您提供的代码中的(var i=0;i,您可以访问
onclick
函数中的
smileys
数组,因为
smileys
是一个全局变量。您的问题是
onclick
事件中循环的
i
索引为8,超出范围

解决此问题的一个好方法是在每个
smiley
图像中保存
i
的值,然后在事件内部访问它,如下所示:

var smileys=[
[“:smile:”,“smile.png”],
[“:sad:”,“sad.png”],
[“:love:”,“love.png”],
[“:angry:”,“angry.png”],
[“:惊奇:”,“惊奇.png”],
[“:laugh:”,“laugh.png”],
[“:wink:”,“wink.png”],
[“:crying:”,“crying.png”],
];
$(文档).ready(函数(){
for(var i=0;i


您可以在其周围添加代码吗?这样我们就可以看到变量works的范围可能重复。使用
(函数(i){smiley.onclick=function(){alert(smileys[i][0]);};})(i);
而不是
smiley.onclick
行。您的问题不在于无法访问
smileys
。当执行
onclick
函数时,变量
i
是数组外部的索引。当然,您可以访问
onclick
函数中的数组,因为数组是全局的。您的问题是lem是超出范围的
I
为8。如果您无法访问
smileys
,您将得到
ReferenceError:smileys未定义
。精确读取错误:这里有一个
TypeError
。因此找到了所有变量,但您试图访问一个未定义值的属性,即ode>smileys[i]
。这是因为
i
是8。谢谢,但结果是一样的。嗯……循环中的闭包或
let
语句将是更好的解决方案;将任意属性存储到元素中(不使用
数据-
属性)是一个奇怪且不稳定的解决方法…@Xufox如果你不想支持旧浏览器,你绝对可以使用
数据-
属性。但是
属性适用于所有浏览器。它不是一个“任意属性”,它是HTML规范的一部分。是的,但是图像没有
属性。它不是全局属性。当然,您可以使用
数据-
属性,这就是我排除它们的原因(“不使用
数据-
属性”)这是一个奇怪的解决办法。@Xufox我想说的是,
数据-
属性是HTML5的一部分,而“自定义”属性已经被所有浏览器支持很长时间了。是的,
不是一个全局属性,所以如果将其添加到图像中,它将成为一个“自定义属性”。如果您希望您的代码更加现代,那么我完全同意您的看法,即使用
数据-
属性是一种可行的方法。