大家好我这里有两个javascript函数 - 在第一个我必须将变量名称从'element'和'property'更改为'celement'和'cproperty'以避免它们与其他函数发生冲突。我想知道有没有办法构建你的函数,以便它们可以使用相同的变量名?任何建议都会很棒!非常感谢
使用Javascript:
function colorPickDynamic (startcolor, cp){
var i,
j,
x,
celement = []
cproperty = []
for (x=0, i = 2, j = 3; j <= arguments.length; i+=2, j+=2, x++) {
celement[x]=arguments[i]
cproperty[x]=arguments[j]
}
$(cp).ColorPicker({
color: startcolor,
onShow: function (colpkr) {
$(colpkr).fadeIn(500)
return false
},
onHide: function (colpkr) {
$(colpkr).fadeOut(500)
return false
},
onChange: function (hsb, hex, rgb) {
$(cp + ' div').css('backgroundColor', '#' + hex)
for (x = 0; x < celement.length; x++) {
updateAllCSS(celement[x], cproperty[x], '#' + hex)
}
}
})
}
var cssObject = {}
function updateAllCSS() {
var x,
i,
j,
k,
element = []
property = []
value = []
for (x=0, i = 0, j = 1, k = 2; k <= arguments.length; i+=3, j+=3, k+=3, x++) {
element[x]=arguments[i]
property[x]=arguments[j]
value[x]=arguments[k]
}
//updateThemeCreatorCSS
for (x = 0; x < element.length; x++) {
updateThemeCreatorCSS(element[x], property[x], value[x])
}
//updateOutputCSS
for (x = 0; x < element.length; x++) {
updateOutputCSS(element[x], property[x], value[x])
}
function updateThemeCreatorCSS(element, property, value) {
$('#homeIframe').contents().find(element).css(property, value)
$('#generalIframe').contents().find(element).css(property, value)
$('#formIframe').contents().find(element).css(property, value)
}
function updateOutputCSS(element, property, value) {
if (!cssObject[element]) cssObject[element] = {}
cssObject[element][property] = value
$('#css_output').text('')
for (var element in cssObject) {
$('#css_output').append(element + ' {')
var properties = cssObject[element]
for (var property in properties) {
$('#css_output').append(property + ': ' + properties[property] + ' !important;')
}
$('#css_output').append('} <br />')
}
}
}
答案 0 :(得分:3)
你和你的var
declaration做得很好,只有你忘记了一些逗号,所以他们得到了全球性。在colorPickDynamic
:
var i,
j,
x,
celement = [], // <- !!!
cproperty = []; // semicolon optional, but recommended
和updateAllCSS
:
var x,
i,
j,
k,
element = [], // <- !!!
property = [], // <- !!!
value = []; // semicolon optional, but recommended
如果省略逗号,将自动插入分号(因此会发生奇怪的事情),并且该行的结尾将成为声明语句的结尾。下一行将按常规解释,它是对非局部变量的赋值。你的脚本像
一样执行var i;
var j;
var x;
celement = [];
cproperty = [];
答案 1 :(得分:3)
是的,他们通常是私人的。
这是你的错误:
var i,
j,
x,
element = [] // <-- you forgot the comma!
property = [] // <-- recommend using a semicolon here
并在另一个函数中:
var x,
i,
j,
k,
element = [] // <-- you forgot the comma!
property = [] // <-- you forgot the comma!
value = [] // <-- recommend using a semicolon here
使用var
关键字声明的变量是全局变量。
为了避免混淆,我建议您现在不要使用一个var
声明多个变量:
var x;
var i;
var j;
var k;
var element = [];
var property = [];
var value = [];
当你习惯使用javascript时,这样做是完全可以的,因为那时你的大脑会自动检测到丢失的逗号。并习惯使用分号。经验丰富的javascript程序员会自动检测丢失的分号作为可能的错误。
答案 2 :(得分:1)
函数中定义的变量只是函数中定义的变量。
这意味着它们不存在于该范围之外。
function foo(){
var bar = 'hello';
alert('Inside function: ' + bar);
}
foo();
alert('Outside function: ' + bar);
这会给你提醒:Inside function: hello
错误:Uncaught ReferenceError: bar is not defined
答案 3 :(得分:0)
阅读这篇文章。它讨论了JS中的私有变量。
http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-private-variables-in-javascript/
答案 4 :(得分:0)
JS具有功能范围。无论涉及哪些其他结构,函数都可以访问嵌套在其中的外部函数作用域中的所有内容。从某种意义上说,每个内部定义的函数都使用外部函数的作用域作为基础。但是,想到这一点的方式就是内部功能的范围层。
如果引用var,则JavaScript调用对象将检查函数的本地范围,然后检查下一个函数,依此类推,直到找到具有该名称的第一个可用函数,直到它到达全局范围。
因此在内部函数中使用'var'进行声明将阻止对具有相同名称的外部变量var进行更改。
重大注意事项 - 所有这些仅与定义功能的位置有关。
这些继承的范围是人们在说“封闭”这个词时应该真正的意思。它是定义范围上下文(那些层)与函数的绑定。
现在,闭包可能会让人感到困惑:
function buildAFunction(){
var
whichOne = "buildAFunction's var";
return function(){ alert(whichOne); }
}
function anotherFunction(){
var //format I use for adding clarity to comma-separated var decs sometimes.
whichOne = "anotherFunction's var",
builtFunc = buildAFunction();
builtFunc();
}
anotherFunction(); //alerts "buildAFunction's var"
您可以移动一个函数,但它仍然只能访问定义它的位置。起初它可能是一个令人头疼的问题,但当你学会充分利用它时,这是一个愚蠢的强大功能。要做相反的事情,即在新的上下文中自动神奇地使用函数,你需要查看'this'关键字,这通常仅在将函数赋值给对象的属性时才有用。